|  |  |  | @ -8,10 +8,107 @@ | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * 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> | 
			
		
	
		
			
				
					|  |  |  |  |  * @since 2.0 | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | 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.';'); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |