mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-03 22:32:40 +08:00
Method "YiiRequirementChecker::check()" has been implemented.
This commit is contained in:
@ -10,8 +10,49 @@ use yiiunit\TestCase;
|
|||||||
*/
|
*/
|
||||||
class YiiRequirementCheckerTest extends TestCase
|
class YiiRequirementCheckerTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testCreate() {
|
public function testCheck()
|
||||||
$requirementChecker = new YiiRequirementChecker();
|
{
|
||||||
$this->assertTrue(is_object($requirementChecker));
|
$requirementsChecker = new YiiRequirementChecker();
|
||||||
|
|
||||||
|
$requirements = array(
|
||||||
|
'requirementPass' => array(
|
||||||
|
'name' => 'Requirement 1',
|
||||||
|
'mandatory' => true,
|
||||||
|
'condition' => true,
|
||||||
|
'by' => 'Requirement 1',
|
||||||
|
'memo' => 'Requirement 1',
|
||||||
|
),
|
||||||
|
'requirementError' => array(
|
||||||
|
'name' => 'Requirement 2',
|
||||||
|
'mandatory' => true,
|
||||||
|
'condition' => false,
|
||||||
|
'by' => 'Requirement 2',
|
||||||
|
'memo' => 'Requirement 2',
|
||||||
|
),
|
||||||
|
'requirementWarning' => array(
|
||||||
|
'name' => 'Requirement 3',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => false,
|
||||||
|
'by' => 'Requirement 3',
|
||||||
|
'memo' => 'Requirement 3',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
$checkResult = $requirementsChecker->check($requirements);
|
||||||
|
$summary = $checkResult['summary'];
|
||||||
|
|
||||||
|
$this->assertEquals(count($requirements), $summary['total'], 'Wrong summary total!');
|
||||||
|
$this->assertEquals(1, $summary['errors'], 'Wrong summary errors!');
|
||||||
|
$this->assertEquals(1, $summary['warnings'], 'Wrong summary warnings!');
|
||||||
|
|
||||||
|
$checkedRequirements = $checkResult['requirements'];
|
||||||
|
|
||||||
|
$this->assertEquals(false, $checkedRequirements['requirementPass']['error'], 'Passed requirement has an error!');
|
||||||
|
$this->assertEquals(false, $checkedRequirements['requirementPass']['warning'], 'Passed requirement has a warning!');
|
||||||
|
|
||||||
|
$this->assertEquals(true, $checkedRequirements['requirementError']['error'], 'Error requirement has no error!');
|
||||||
|
|
||||||
|
$this->assertEquals(false, $checkedRequirements['requirementWarning']['error'], 'Error requirement has an error!');
|
||||||
|
$this->assertEquals(true, $checkedRequirements['requirementWarning']['warning'], 'Error requirement has no warning!');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,10 +8,107 @@
|
|||||||
/**
|
/**
|
||||||
* YiiRequirementChecker allows checking, if current system meets the requirements for running the application.
|
* YiiRequirementChecker allows checking, if current system meets the requirements for running the application.
|
||||||
*
|
*
|
||||||
|
* @property array|null $result the check results.
|
||||||
|
*
|
||||||
* @author Paul Klimov <klimov.paul@gmail.com>
|
* @author Paul Klimov <klimov.paul@gmail.com>
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
*/
|
*/
|
||||||
class YiiRequirementChecker
|
class YiiRequirementChecker
|
||||||
{
|
{
|
||||||
|
function check($requirements)
|
||||||
|
{
|
||||||
|
if (!is_array($requirements)) {
|
||||||
|
$this->usageError("Requirements must be an array!");
|
||||||
|
}
|
||||||
|
$summary = array(
|
||||||
|
'total' => 0,
|
||||||
|
'errors' => 0,
|
||||||
|
'warnings' => 0,
|
||||||
|
);
|
||||||
|
foreach ($requirements as $key => $rawRequirement) {
|
||||||
|
$requirement = $this->normalizeRequirement($rawRequirement, $key);
|
||||||
|
|
||||||
|
$summary['total']++;
|
||||||
|
if (!$requirement['condition']) {
|
||||||
|
if ($requirement['mandatory']) {
|
||||||
|
$requirement['error'] = true;
|
||||||
|
$requirement['warning'] = true;
|
||||||
|
$summary['errors']++;
|
||||||
|
} else {
|
||||||
|
$requirement['error'] = false;
|
||||||
|
$requirement['warning'] = true;
|
||||||
|
$summary['warnings']++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$requirement['error'] = false;
|
||||||
|
$requirement['warning'] = false;
|
||||||
|
}
|
||||||
|
$requirements[$key] = $requirement;
|
||||||
|
}
|
||||||
|
$result = array(
|
||||||
|
'summary' => $summary,
|
||||||
|
'requirements' => $requirements,
|
||||||
|
);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes requirement ensuring it has correct format.
|
||||||
|
* @param array $requirement raw requirement.
|
||||||
|
* @param int $requirementKey requirement key in the list.
|
||||||
|
* @return array normalized requirement.
|
||||||
|
*/
|
||||||
|
function normalizeRequirement($requirement, $requirementKey=0)
|
||||||
|
{
|
||||||
|
if (!is_array($requirement)) {
|
||||||
|
$this->usageError('Requirement must be an array!');
|
||||||
|
}
|
||||||
|
if (!array_key_exists('condition', $requirement)) {
|
||||||
|
$this->usageError("Requirement '{$requirementKey}' has no condition!");
|
||||||
|
} else {
|
||||||
|
$evalPrefix = 'eval:';
|
||||||
|
if (is_string($requirement['condition']) && strpos($requirement['condition'], $evalPrefix)===0) {
|
||||||
|
$expression = substr($requirement['condition'], strlen($evalPrefix));
|
||||||
|
$requirement['condition'] = $this->evaluateExpression($expression);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!array_key_exists('name', $requirement)) {
|
||||||
|
$requirement['name'] = is_numeric($requirementKey) ? 'Requirement #'.$requirementKey : $requirementKey;
|
||||||
|
}
|
||||||
|
if (!array_key_exists('mandatory', $requirement)) {
|
||||||
|
if (array_key_exists('required', $requirement)) {
|
||||||
|
$requirement['mandatory'] = $requirement['required'];
|
||||||
|
} else {
|
||||||
|
$requirement['mandatory'] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!array_key_exists('by', $requirement)) {
|
||||||
|
$requirement['by'] = 'Unknown';
|
||||||
|
}
|
||||||
|
if (!array_key_exists('memo', $requirement)) {
|
||||||
|
$requirement['memo'] = '';
|
||||||
|
}
|
||||||
|
return $requirement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a usage error.
|
||||||
|
* This method will then terminate the execution of the current application.
|
||||||
|
* @param string $message the error message
|
||||||
|
*/
|
||||||
|
function usageError($message)
|
||||||
|
{
|
||||||
|
echo "Error: $message\n\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates a PHP expression under the context of this class.
|
||||||
|
* @param string $expression a PHP expression to be evaluated.
|
||||||
|
* @return mixed the expression result.
|
||||||
|
*/
|
||||||
|
function evaluateExpression($expression)
|
||||||
|
{
|
||||||
|
return eval('return '.$expression.';');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user