MDL-48177 core: Plugin environment checks with no version of Moodle
The environment.xml files in plugins force you to define the versions of Moodle that the checks should be carried out against. For community plugins the environment requirements of the plugin seem unlikely to be dependant on the version of Moodle. This patch will allow the environment.xml files to use a new <PLUGIN> tag in place of the <MOODLE version="> tag. This solution has the following properties: * The Environment file will not break versions of Moodle that do not support the PLUGIN syntax. * Specific versioned MOODLE tags can still be defined for versions of Moodle that do not have this patch. * If both MOODLE and PLUGIN tags exist the PLUGIN tag will be used in preference. * The PLUGIN tag will not function in the main Moodle environment.xml file. * The PLUGIN tag has a mandatory name attribute that must match the frankenstyle name of the plugin being tested.
This commit is contained in:
committed by
Eloy Lafuente (stronk7)
parent
f271b113a6
commit
8072628a67
@@ -327,6 +327,10 @@ function get_list_of_environment_versions($contents) {
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($contents['COMPATIBILITY_MATRIX']['#']['PLUGIN'])) {
|
||||
$versions[] = 'all';
|
||||
}
|
||||
|
||||
return $versions;
|
||||
}
|
||||
|
||||
@@ -396,6 +400,14 @@ function get_environment_for_version($version, $env_select) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If $env_select is not numeric then this is being called on a plugin, and not the core environment.xml
|
||||
// If a version of 'all' is in the arry is also means that the new <PLUGIN> tag was found, this should
|
||||
// be matched against any version of Moodle.
|
||||
if (!is_numeric($env_select) && in_array('all', $versions)
|
||||
&& environment_verify_plugin($env_select, $contents['COMPATIBILITY_MATRIX']['#']['PLUGIN'][0])) {
|
||||
return $contents['COMPATIBILITY_MATRIX']['#']['PLUGIN'][0];
|
||||
}
|
||||
|
||||
/// If the version requested is available
|
||||
if (!in_array($version, $versions)) {
|
||||
return false;
|
||||
@@ -407,6 +419,19 @@ function get_environment_for_version($version, $env_select) {
|
||||
return $contents['COMPATIBILITY_MATRIX']['#']['MOODLE'][$fl_arr[$version]];
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a plugin tag has a name attribute and it matches the plugin being tested.
|
||||
*
|
||||
* @param string $plugin the name of the plugin.
|
||||
* @param array $pluginxml the xmlised structure for the plugin tag being tested.
|
||||
* @return boolean true if the name attribute exists and matches the plugin being tested.
|
||||
*/
|
||||
function environment_verify_plugin($plugin, $pluginxml) {
|
||||
if (!isset($pluginxml['@']['name']) || $pluginxml['@']['name'] != $plugin) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will check for everything (DB, PHP and PHP extensions for now)
|
||||
|
||||
@@ -53,4 +53,79 @@ class core_environment_testcase extends advanced_testcase {
|
||||
$this->assertTrue($environment_result->getStatus(), "Problem detected in environment ($environment_result->part:$environment_result->info), fix all warnings and errors!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the get_list_of_environment_versions() function.
|
||||
*/
|
||||
public function test_get_list_of_environment_versions() {
|
||||
global $CFG;
|
||||
require_once($CFG->libdir.'/environmentlib.php');
|
||||
// Build a sample xmlised environment.xml.
|
||||
$xml = <<<END
|
||||
<COMPATIBILITY_MATRIX>
|
||||
<MOODLE version="1.9">
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</MOODLE>
|
||||
<MOODLE version="2.5">
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</MOODLE>
|
||||
<MOODLE version="2.6">
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</MOODLE>
|
||||
<MOODLE version="2.7">
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</MOODLE>
|
||||
<PLUGIN name="block_test">
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</PLUGIN>
|
||||
</COMPATIBILITY_MATRIX>
|
||||
END;
|
||||
$environemt = xmlize($xml);
|
||||
$versions = get_list_of_environment_versions($environemt);
|
||||
$this->assertCount(5, $versions);
|
||||
$this->assertContains('1.9', $versions);
|
||||
$this->assertContains('2.5', $versions);
|
||||
$this->assertContains('2.6', $versions);
|
||||
$this->assertContains('2.7', $versions);
|
||||
$this->assertContains('all', $versions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the environment_verify_plugin() function.
|
||||
*/
|
||||
public function test_verify_plugin() {
|
||||
global $CFG;
|
||||
require_once($CFG->libdir.'/environmentlib.php');
|
||||
// Build sample xmlised environment file fragments.
|
||||
$plugin1xml = <<<END
|
||||
<PLUGIN name="block_testcase">
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</PLUGIN>
|
||||
END;
|
||||
$plugin1 = xmlize($plugin1xml);
|
||||
$plugin2xml = <<<END
|
||||
<PLUGIN>
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="xsl" level="required" />
|
||||
</PHP_EXTENSIONS>
|
||||
</PLUGIN>
|
||||
END;
|
||||
$plugin2 = xmlize($plugin2xml);
|
||||
$this->assertTrue(environment_verify_plugin('block_testcase', $plugin1['PLUGIN']));
|
||||
$this->assertFalse(environment_verify_plugin('block_testcase', $plugin2['PLUGIN']));
|
||||
$this->assertFalse(environment_verify_plugin('mod_someother', $plugin1['PLUGIN']));
|
||||
$this->assertFalse(environment_verify_plugin('mod_someother', $plugin2['PLUGIN']));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@ information provided here is intended especially for developers.
|
||||
* The file pluginlib.php was deprecated since 2.6 and has now been removed, do not include or require it.
|
||||
* \core_component::fetch_subsystems() now returns a valid path for completion component instead of null.
|
||||
* Deprecated JS global methods have been removed (show_item, destroy_item, hide_item, addonload, getElementsByTagName, findChildNodes).
|
||||
* For 3rd party plugin specific environment.xml files, it's now possible to specify version independent checks by using the
|
||||
<PLUGIN name="component_name"> tag instead of the version dependent <MOODLE version="x.y"> one. If the PLUGIN tag is used any
|
||||
Moodle specific tags will be ignored.
|
||||
|
||||
=== 2.8 ===
|
||||
|
||||
|
||||
Reference in New Issue
Block a user