diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php
index 9a5cbde..e7156d8 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php
@@ -7,9 +7,11 @@
namespace Drupal\aggregator\Form;
-use Drupal\system\SystemConfigFormBase;
+use Drupal\Core\Form\FormInterface;
use Drupal\Core\Config\ConfigFactory;
+use Drupal\system\SystemConfigFormBase;
use Drupal\aggregator\Plugin\AggregatorPluginManager;
+use Drupal\Component\Utility\String;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
@@ -18,6 +20,13 @@
class SettingsForm extends SystemConfigFormBase {
/**
+ * The configuration object factory.
+ *
+ * @var \Drupal\Core\Config\ConfigFactory
+ */
+ protected $configFactory;
+
+ /**
* The aggregator plugin managers.
*
* @var array
@@ -36,6 +45,13 @@ class SettingsForm extends SystemConfigFormBase {
);
/**
+ * The instanciated plugin instances.
+ *
+ * @var array
+ */
+ protected $instances = array();
+
+ /**
* Constructs a \Drupal\aggregator\SettingsForm object.
*
* @param \Drupal\Core\Config\ConfigFactory $config_factory
@@ -57,13 +73,13 @@ public function __construct(ConfigFactory $config_factory, AggregatorPluginManag
// Get all available fetcher, parser and processor definitions.
foreach (array('fetcher', 'parser', 'processor') as $type) {
foreach ($this->managers[$type]->getDefinitions() as $id => $definition) {
- $this->definitions[$type][$id] = format_string('@title @description', array('@title' => $definition['title'], '@description' => $definition['description']));
+ $this->definitions[$type][$id] = String::format('@title @description', array('@title' => $definition['title'], '@description' => $definition['description']));
}
}
}
/**
- * Implements \Drupal\Core\ControllerInterface::create().
+ * {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
@@ -75,14 +91,14 @@ public static function create(ContainerInterface $container) {
}
/**
- * Implements \Drupal\Core\Form\FormInterface::getFormID().
+ * {@inheritdoc}
*/
public function getFormID() {
return 'aggregator_admin_form';
}
/**
- * Implements \Drupal\Core\Form\FormInterface::buildForm().
+ * {@inheritdoc}
*/
public function buildForm(array $form, array &$form_state) {
$config = $this->configFactory->get('aggregator.settings');
@@ -136,28 +152,56 @@ public function buildForm(array $form, array &$form_state) {
$form['basic_conf'] += $basic_conf;
}
+ // Call buildForm() on the active fetcher and parser.
+ foreach (array('fetcher', 'parser') as $type) {
+ $active = $config->get($type);
+ if (array_key_exists($active, $this->definitions[$type])) {
+ $instance = $this->managers[$type]->createInstance($active);
+ if ($instance instanceof FormInterface) {
+ $form = $instance->buildForm($form, $form_state);
+ // Store the instance for validate and submit handlers.
+ $this->instances[] = $instance;
+ }
+ }
+ }
+
// Implementing processor plugins will expect an array at $form['processors'].
$form['processors'] = array();
- // Call settingsForm() for each active processor.
+ // Call buildForm() for each active processor.
foreach ($this->definitions['processor'] as $id => $definition) {
if (in_array($id, $config->get('processors'))) {
- $form = $this->managers['processor']->createInstance($id)->settingsForm($form, $form_state);
+ $instance = $this->managers['processor']->createInstance($id);
+ if ($instance instanceof FormInterface) {
+ $form = $instance->buildForm($form, $form_state);
+ // Store the instance for validate and submit handlers.
+ $this->instances[] = $instance;
+ }
}
}
return parent::buildForm($form, $form_state);
}
/**
- * Implements \Drupal\Core\Form\FormInterface::submitForm().
+ * {@inheritdoc}
+ */
+ public function validateForm(array &$form, array &$form_state) {
+ parent::validateForm($form, $form_state);
+ // Let active plugins validate their settings.
+ foreach ($this->instances as $instance) {
+ $instance->validateForm($form, $form_state);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
*/
public function submitForm(array &$form, array &$form_state) {
parent::submitForm($form, $form_state);
$config = $this->configFactory->get('aggregator.settings');
- // Let active processors save their settings.
- foreach ($this->definitions['processor'] as $id => $definition) {
- if (in_array($id, $config->get('processors'))) {
- $this->managers['processor']->createInstance($id)->settingsSubmit($form, $form_state);
- }
+
+ // Let active plugins save their settings.
+ foreach ($this->instances as $instance) {
+ $instance->submitForm($form, $form_state);
}
$config->set('items.allowed_html', $form_state['values']['aggregator_allowed_html_tags']);
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php
index 9f51a71..950eecf 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php
@@ -8,9 +8,9 @@
namespace Drupal\aggregator\Plugin;
use Drupal\Component\Plugin\PluginManagerBase;
-use Drupal\Component\Plugin\Factory\DefaultFactory;
use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
use Drupal\Core\Plugin\Discovery\CacheDecorator;
+use Drupal\Core\Plugin\Factory\ContainerFactory;
/**
* Manages aggregator plugins.
@@ -28,6 +28,6 @@ class AggregatorPluginManager extends PluginManagerBase {
public function __construct($type, array $namespaces) {
$this->discovery = new AnnotatedClassDiscovery('aggregator', $type, $namespaces);
$this->discovery = new CacheDecorator($this->discovery, "aggregator_$type:" . language(LANGUAGE_TYPE_INTERFACE)->langcode);
- $this->factory = new DefaultFactory($this->discovery);
+ $this->factory = new ContainerFactory($this);
}
}
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginSettingsBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginSettingsBase.php
new file mode 100644
index 0000000..f23bc4c
--- /dev/null
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginSettingsBase.php
@@ -0,0 +1,44 @@
+get('http_default_client'));
+ }
+
+ /**
+ * Constructs a DefaultFetcher object.
+ */
+ public function __construct(array $configuration, $plugin_id, array $plugin_definition, Client $http_client) {
+ parent::__construct($configuration, $plugin_id, $plugin_definition);
+ $this->httpClient = $http_client;
+ }
+ /**
+ * {@inheritdoc}
*/
public function fetch(Feed $feed) {
- // @todo: Inject the http client.
- $request = \Drupal::httpClient()->get($feed->url->value);
+ $request = $this->httpClient->get($feed->url->value);
$feed->source_string = FALSE;
// Generate conditional GET headers.
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php
index 0086bac..1503212 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php
@@ -7,10 +7,12 @@
namespace Drupal\aggregator\Plugin\aggregator\parser;
+use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\aggregator\Plugin\ParserInterface;
use Drupal\aggregator\Plugin\Core\Entity\Feed;
use Drupal\Component\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;
+use Drupal\Core\Cache\Cache;
/**
* Defines a default parser implementation.
@@ -68,7 +70,14 @@ class DefaultParser implements ParserInterface {
protected $item;
/**
- * Implements \Drupal\aggregator\Plugin\ParserInterface::parse().
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
+ return new static($configuration, $plugin_id, $plugin_definition);
+ }
+
+ /**
+ * {@inheritdoc}
*/
public function parse(Feed $feed) {
// Filter the input data.
@@ -90,7 +99,7 @@ public function parse(Feed $feed) {
$feed->image->value = !empty($image['url']) ? $image['url'] : '';
// Clear the page and block caches.
- cache_invalidate_tags(array('content' => TRUE));
+ Cache::invalidateTags(array('content' => TRUE));
return TRUE;
}
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php
index 08777d1..e94d4ac 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php
@@ -7,12 +7,14 @@
namespace Drupal\aggregator\Plugin\aggregator\processor;
-use Drupal\Component\Plugin\PluginBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\aggregator\Plugin\ProcessorInterface;
+use Drupal\aggregator\Plugin\AggregatorPluginSettingsBase;
use Drupal\aggregator\Plugin\Core\Entity\Feed;
use Drupal\Component\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;
use Drupal\Core\Database\Database;
+use Drupal\Core\Config\ConfigFactory;
/**
* Defines a default processor implementation.
@@ -25,13 +27,35 @@
* description = @Translation("Creates lightweight records from feed items.")
* )
*/
-class DefaultProcessor extends PluginBase implements ProcessorInterface {
+class DefaultProcessor extends AggregatorPluginSettingsBase implements ProcessorInterface {
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsForm().
+ * Contains the configuration object factory.
+ *
+ * @var \Drupal\Core\Config\ConfigFactory
*/
- public function settingsForm(array $form, array &$form_state) {
- $config = config('aggregator.settings');
+ protected $configFactory;
+
+ /**
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
+ return new static($configuration, $plugin_id, $plugin_definition, $container->get('config.factory'));
+ }
+
+ /**
+ * Constructs a DefaultProcessor object.
+ */
+ public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactory $config) {
+ parent::__construct($configuration, $plugin_id, $plugin_definition);
+ $this->configFactory = $config;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildForm(array $form, array &$form_state) {
+ $config = $this->configFactory->get('aggregator.settings');
$processors = $config->get('processors');
$info = $this->getDefinition();
$items = drupal_map_assoc(array(3, 5, 10, 15, 20, 25), array($this, 'formatItems'));
@@ -84,9 +108,9 @@ public function settingsForm(array $form, array &$form_state) {
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsSubmit().
+ * {@inheritdoc}
*/
- public function settingsSubmit(array $form, array &$form_state) {
+ public function submitForm(array &$form, array &$form_state) {
$config = config('aggregator.settings');
$config->set('items.expire', $form_state['values']['aggregator_clear'])
->set('items.teaser_length', $form_state['values']['aggregator_teaser_length'])
@@ -96,7 +120,7 @@ public function settingsSubmit(array $form, array &$form_state) {
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::process().
+ * {@inheritdoc}
*/
public function process(Feed $feed) {
if (!is_array($feed->items)) {
@@ -147,7 +171,7 @@ public function process(Feed $feed) {
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::remove().
+ * {@inheritdoc}
*/
public function remove(Feed $feed) {
$iids = Database::getConnection()->query('SELECT iid FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->id()))->fetchCol();
@@ -159,9 +183,7 @@ public function remove(Feed $feed) {
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::postProcess().
- *
- * Expires items from a feed depending on expiration settings.
+ * {@inheritdoc}
*/
public function postProcess(Feed $feed) {
$aggregator_clear = config('aggregator.settings')->get('items.expire');
diff --git a/core/modules/aggregator/tests/Drupal/aggregator/Tests/Plugin/AggregatorPluginSettingsBaseTest.php b/core/modules/aggregator/tests/Drupal/aggregator/Tests/Plugin/AggregatorPluginSettingsBaseTest.php
new file mode 100644
index 0000000..2ad2610
--- /dev/null
+++ b/core/modules/aggregator/tests/Drupal/aggregator/Tests/Plugin/AggregatorPluginSettingsBaseTest.php
@@ -0,0 +1,103 @@
+ 'Aggregator plugin settings tests',
+ 'description' => 'Test settings configuration of individual aggregator plugins.',
+ 'group' => 'Aggregator',
+ );
+ }
+
+ public function setUp() {
+ $this->configFactory = $this->getConfigFactoryStub(
+ array(
+ 'aggregator.settings' => array(
+ 'processors' => array('aggregator_test'),
+ ),
+ 'aggregator_test.settings' => array(),
+ )
+ );
+ foreach (array('fetcher', 'parser', 'processor') as $type) {
+ $this->managers[$type] = $this->getMockBuilder('Drupal\aggregator\Plugin\AggregatorPluginManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->managers[$type]->expects($this->once())
+ ->method('getDefinitions')
+ ->will($this->returnValue(array('aggregator_test' => array('title' => '', 'description' => ''))));
+ }
+ $this->settingsForm = new SettingsForm($this->configFactory, $this->managers['fetcher'], $this->managers['parser'], $this->managers['processor']);
+ }
+
+ /**
+ * Test for AggregatorPluginSettingsBase.
+ *
+ * Ensure that the settings form calls build, validate and submit methods on
+ * plugins that extend AggregatorPluginSettingsBase.
+ */
+ public function testSettingsForm() {
+ $form_state = array();
+ $test_processor = $this->getMock(
+ 'Drupal\aggregator_test\Plugin\aggregator\processor\TestProcessor',
+ array('buildForm', 'validateForm', 'submitForm'),
+ array(array(), 'aggregator_test', array(), $this->configFactory)
+ );
+ $test_processor->expects($this->at(0))
+ ->method('buildForm')
+ ->with($this->anything(), $form_state)
+ ->will($this->returnArgument(0));
+ $test_processor->expects($this->at(1))
+ ->method('validateForm')
+ ->with($this->anything(), $form_state);
+ // @todo Restore when we get rid of drupal_set_message().
+ /*$test_processor->expects($this->at(2))
+ ->method('submitForm')
+ ->with($this->anything(), $form_state);*/
+ $this->managers['processor']->expects($this->once())
+ ->method('createInstance')
+ ->with($this->equalTo('aggregator_test'))
+ ->will($this->returnValue($test_processor));
+ $form = $this->settingsForm->buildForm(array(), $form_state);
+ $this->settingsForm->validateForm($form, $form_state);
+ // @todo Restore when we get rid of drupal_set_message().
+ //$this->settingsForm->submitForm($form, $form_state);
+ }
+
+}
diff --git a/core/modules/aggregator/tests/aggregator_test.info.yml b/core/modules/aggregator/tests/modules/aggregator_test/aggregator_test.info.yml
similarity index 100%
rename from core/modules/aggregator/tests/aggregator_test.info.yml
rename to core/modules/aggregator/tests/modules/aggregator_test/aggregator_test.info.yml
diff --git a/core/modules/aggregator/tests/aggregator_test.module b/core/modules/aggregator/tests/modules/aggregator_test/aggregator_test.module
similarity index 100%
rename from core/modules/aggregator/tests/aggregator_test.module
rename to core/modules/aggregator/tests/modules/aggregator_test/aggregator_test.module
diff --git a/core/modules/aggregator/tests/aggregator_test_atom.xml b/core/modules/aggregator/tests/modules/aggregator_test/aggregator_test_atom.xml
similarity index 100%
rename from core/modules/aggregator/tests/aggregator_test_atom.xml
rename to core/modules/aggregator/tests/modules/aggregator_test/aggregator_test_atom.xml
diff --git a/core/modules/aggregator/tests/aggregator_test_rss091.xml b/core/modules/aggregator/tests/modules/aggregator_test/aggregator_test_rss091.xml
similarity index 100%
rename from core/modules/aggregator/tests/aggregator_test_rss091.xml
rename to core/modules/aggregator/tests/modules/aggregator_test/aggregator_test_rss091.xml
diff --git a/core/modules/aggregator/tests/aggregator_test_title_entities.xml b/core/modules/aggregator/tests/modules/aggregator_test/aggregator_test_title_entities.xml
similarity index 100%
rename from core/modules/aggregator/tests/aggregator_test_title_entities.xml
rename to core/modules/aggregator/tests/modules/aggregator_test/aggregator_test_title_entities.xml
diff --git a/core/modules/aggregator/tests/config/aggregator_test.settings.yml b/core/modules/aggregator/tests/modules/aggregator_test/config/aggregator_test.settings.yml
similarity index 100%
rename from core/modules/aggregator/tests/config/aggregator_test.settings.yml
rename to core/modules/aggregator/tests/modules/aggregator_test/config/aggregator_test.settings.yml
diff --git a/core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/fetcher/TestFetcher.php b/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/fetcher/TestFetcher.php
similarity index 100%
rename from core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/fetcher/TestFetcher.php
rename to core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/fetcher/TestFetcher.php
diff --git a/core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/parser/TestParser.php b/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/parser/TestParser.php
similarity index 100%
rename from core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/parser/TestParser.php
rename to core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/parser/TestParser.php
diff --git a/core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php b/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php
similarity index 56%
rename from core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php
rename to core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php
index 3ffe213..243183f 100644
--- a/core/modules/aggregator/tests/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php
+++ b/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php
@@ -7,11 +7,13 @@
namespace Drupal\aggregator_test\Plugin\aggregator\processor;
-use Drupal\Component\Plugin\PluginBase;
use Drupal\aggregator\Plugin\ProcessorInterface;
use Drupal\aggregator\Plugin\Core\Entity\Feed;
+use Drupal\aggregator\Plugin\AggregatorPluginSettingsBase;
use Drupal\Component\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;
+use Drupal\Core\Config\ConfigFactory;
+use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines a default processor implementation.
@@ -24,14 +26,35 @@
* description = @Translation("Test generic processor functionality.")
* )
*/
-class TestProcessor extends PluginBase implements ProcessorInterface {
+class TestProcessor extends AggregatorPluginSettingsBase implements ProcessorInterface {
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsForm().
+ * Contains the configuration object factory.
+ *
+ * @var \Drupal\Core\Config\ConfigFactory
*/
- public function settingsForm(array $form, array &$form_state) {
- $config = config('aggregator.settings');
- $processors = $config->get('processors');
+ protected $configFactory;
+
+ /**
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
+ return new static($configuration, $plugin_id, $plugin_definition, $container->get('config.factory'));
+ }
+
+ /**
+ * Constructs a DefaultProcessor object.
+ */
+ public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactory $config) {
+ parent::__construct($configuration, $plugin_id, $plugin_definition);
+ $this->configFactory = $config;
+ }
+
+ /**
+ * {inheritdoc}
+ */
+ public function buildForm(array $form, array &$form_state) {
+ $processors = $this->configFactory->get('aggregator.settings')->get('processors');
$info = $this->getDefinition();
$form['processors'][$info['id']] = array(
@@ -46,22 +69,22 @@ public function settingsForm(array $form, array &$form_state) {
'#type' => 'number',
'#min' => 1,
'#max' => 1000,
- '#default_value' => config('aggregator_test.settings')->get('items.dummy_length'),
+ '#default_value' => $this->configFactory->get('aggregator_test.settings')->get('items.dummy_length'),
);
return $form;
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsSubmit().
+ * {inheritdoc}
*/
- public function settingsSubmit(array $form, array &$form_state) {
- config('aggregator_test.settings')
+ public function submitForm(array &$form, array &$form_state) {
+ $this->configFactory->get('aggregator_test.settings')
->set('items.dummy_length', $form_state['values']['dummy_length'])
->save();
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::process().
+ * {inheritdoc}
*/
public function process(Feed $feed) {
foreach ($feed->items as &$item) {
@@ -71,7 +94,7 @@ public function process(Feed $feed) {
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::remove().
+ * {inheritdoc}
*/
public function remove(Feed $feed) {
// Append a random number, just to change the feed description.
@@ -79,7 +102,7 @@ public function remove(Feed $feed) {
}
/**
- * Implements \Drupal\aggregator\Plugin\ProcessorInterface::postProcess().
+ * {inheritdoc}
*/
public function postProcess(Feed $feed) {
// Double the refresh rate.
diff --git a/core/tests/bootstrap.php b/core/tests/bootstrap.php
index 7f8441e..e27c950 100644
--- a/core/tests/bootstrap.php
+++ b/core/tests/bootstrap.php
@@ -8,8 +8,21 @@
foreach (scandir(__DIR__ . "/../modules") as $module) {
$loader->add('Drupal\\' . $module, __DIR__ . "/../modules/" . $module . "/lib");
+ // @todo This is what http://drupal.org/node/1974266 does.RTBC!
+ // Add test module classes.
+ $test_modules_dir = __DIR__ . "/../modules/$module/tests/modules";
+ if (is_dir($test_modules_dir)) {
+ foreach (scandir($test_modules_dir) as $test_module) {
+ $loader->add('Drupal\\' . $module, $test_modules_dir . '/' . $test_module . "/lib");
+ }
+ }
}
require __DIR__ . "/../../core/lib/Drupal.php";
-// Look into removing this later.
+// @todo Look into removing this later.
define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
+
+// @todo Get rid once http://drupal.org/node/1813762 is in.
+function t($string) {
+ return $string;
+}