rework api of DependencyAnalyzer

This commit is contained in:
Thomas Müller 2014-12-12 12:34:53 +01:00
parent d94c1731d7
commit dcb88e395b
4 changed files with 94 additions and 99 deletions

View File

@ -1112,8 +1112,8 @@ class OC_App {
} }
// check for required dependencies // check for required dependencies
$dependencyAnalyzer = new DependencyAnalyzer($app, new Platform($config), $l); $dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
$missing = $dependencyAnalyzer->analyze(); $missing = $dependencyAnalyzer->analyze($app);
if(!empty($missing)) { if(!empty($missing)) {
$missingMsg = join(PHP_EOL, $missing); $missingMsg = join(PHP_EOL, $missing);
throw new \Exception( throw new \Exception(

View File

@ -1,5 +1,5 @@
<?php <?php
/** /**
* @author Thomas Müller * @author Thomas Müller
* @copyright 2014 Thomas Müller deepdiver@owncloud.com * @copyright 2014 Thomas Müller deepdiver@owncloud.com
* *
@ -20,112 +20,114 @@ class DependencyAnalyzer {
/** @var \OCP\IL10N */ /** @var \OCP\IL10N */
private $l; private $l;
/** @var array */
private $missing = array();
/** @var array */
private $dependencies = array();
private $appInfo = array();
/** /**
* @param array $app
* @param Platform $platform * @param Platform $platform
* @param \OCP\IL10N $l * @param \OCP\IL10N $l
*/ */
function __construct(array $app, Platform $platform, IL10N $l) { function __construct(Platform $platform, IL10N $l) {
$this->platform = $platform; $this->platform = $platform;
$this->l = $l; $this->l = $l;
if (isset($app['dependencies'])) {
$this->dependencies = $app['dependencies'];
}
} }
/** /**
* @param array $app * @param array $app
* @returns array of missing dependencies * @returns array of missing dependencies
*/ */
public function analyze() { public function analyze($app) {
$this->analyzePhpVersion(); $this->appInfo = $app;
$this->analyzeDatabases(); if (isset($app['dependencies'])) {
$this->analyzeCommands(); $dependencies = $app['dependencies'];
$this->analyzeLibraries(); } else {
$this->analyzeOS(); $dependencies = [];
$this->analyzeOC();
return $this->missing;
} }
private function analyzePhpVersion() { return array_merge(
if (isset($this->dependencies['php']['@attributes']['min-version'])) { $this->analyzePhpVersion($dependencies),
$minVersion = $this->dependencies['php']['@attributes']['min-version']; $this->analyzeDatabases($dependencies),
$this->analyzeCommands($dependencies),
$this->analyzeLibraries($dependencies),
$this->analyzeOS($dependencies),
$this->analyzeOC($dependencies, $app));
}
private function analyzePhpVersion($dependencies) {
$missing = [];
if (isset($dependencies['php']['@attributes']['min-version'])) {
$minVersion = $dependencies['php']['@attributes']['min-version'];
if (version_compare($this->platform->getPhpVersion(), $minVersion, '<')) { if (version_compare($this->platform->getPhpVersion(), $minVersion, '<')) {
$this->addMissing((string)$this->l->t('PHP %s or higher is required.', $minVersion)); $missing[] = (string)$this->l->t('PHP %s or higher is required.', $minVersion);
} }
} }
if (isset($this->dependencies['php']['@attributes']['max-version'])) { if (isset($dependencies['php']['@attributes']['max-version'])) {
$maxVersion = $this->dependencies['php']['@attributes']['max-version']; $maxVersion = $dependencies['php']['@attributes']['max-version'];
if (version_compare($this->platform->getPhpVersion(), $maxVersion, '>')) { if (version_compare($this->platform->getPhpVersion(), $maxVersion, '>')) {
$this->addMissing((string)$this->l->t('PHP with a version lower than %s is required.', $maxVersion)); $missing[] = (string)$this->l->t('PHP with a version lower than %s is required.', $maxVersion);
} }
} }
return $missing;
} }
private function analyzeDatabases() { private function analyzeDatabases($dependencies) {
if (!isset($this->dependencies['database'])) { $missing = [];
return; if (!isset($dependencies['database'])) {
return $missing;
} }
$supportedDatabases = $this->dependencies['database']; $supportedDatabases = $dependencies['database'];
if (empty($supportedDatabases)) { if (empty($supportedDatabases)) {
return; return $missing;
} }
if (!is_array($supportedDatabases)) { if (!is_array($supportedDatabases)) {
$supportedDatabases = array($supportedDatabases); $supportedDatabases = array($supportedDatabases);
} }
$supportedDatabases = array_map(function($db) { $supportedDatabases = array_map(function ($db) {
return $this->getValue($db); return $this->getValue($db);
}, $supportedDatabases); }, $supportedDatabases);
$currentDatabase = $this->platform->getDatabase(); $currentDatabase = $this->platform->getDatabase();
if (!in_array($currentDatabase, $supportedDatabases)) { if (!in_array($currentDatabase, $supportedDatabases)) {
$this->addMissing((string)$this->l->t('Following databases are supported: %s', join(', ', $supportedDatabases))); $missing[] = (string)$this->l->t('Following databases are supported: %s', join(', ', $supportedDatabases));
} }
return $missing;
} }
private function analyzeCommands() { private function analyzeCommands($dependencies) {
if (!isset($this->dependencies['command'])) { $missing = [];
return; if (!isset($dependencies['command'])) {
return $missing;
} }
$commands = $this->dependencies['command']; $commands = $dependencies['command'];
if (!is_array($commands)) { if (!is_array($commands)) {
$commands = array($commands); $commands = array($commands);
} }
$os = $this->platform->getOS(); $os = $this->platform->getOS();
foreach($commands as $command) { foreach ($commands as $command) {
if (isset($command['@attributes']['os']) && $command['@attributes']['os'] !== $os) { if (isset($command['@attributes']['os']) && $command['@attributes']['os'] !== $os) {
continue; continue;
} }
$commandName = $this->getValue($command); $commandName = $this->getValue($command);
if (!$this->platform->isCommandKnown($commandName)) { if (!$this->platform->isCommandKnown($commandName)) {
$this->addMissing((string)$this->l->t('The command line tool %s could not be found', $commandName)); $missing[] = (string)$this->l->t('The command line tool %s could not be found', $commandName);
} }
} }
return $missing;
} }
private function analyzeLibraries() { private function analyzeLibraries($dependencies) {
if (!isset($this->dependencies['lib'])) { $missing = [];
return; if (!isset($dependencies['lib'])) {
return $missing;
} }
$libs = $this->dependencies['lib']; $libs = $dependencies['lib'];
if (!is_array($libs)) { if (!is_array($libs)) {
$libs = array($libs); $libs = array($libs);
} }
foreach($libs as $lib) { foreach ($libs as $lib) {
$libName = $this->getValue($lib); $libName = $this->getValue($lib);
$libVersion = $this->platform->getLibraryVersion($libName); $libVersion = $this->platform->getLibraryVersion($libName);
if (is_null($libVersion)) { if (is_null($libVersion)) {
$this->addMissing((string)$this->l->t('The library %s is not available.', $libName)); $missing[] = (string)$this->l->t('The library %s is not available.', $libName);
continue; continue;
} }
@ -133,29 +135,31 @@ class DependencyAnalyzer {
if (isset($lib['@attributes']['min-version'])) { if (isset($lib['@attributes']['min-version'])) {
$minVersion = $lib['@attributes']['min-version']; $minVersion = $lib['@attributes']['min-version'];
if (version_compare($libVersion, $minVersion, '<')) { if (version_compare($libVersion, $minVersion, '<')) {
$this->addMissing((string)$this->l->t('Library %s with a version higher than %s is required - available version %s.', $missing[] = (string)$this->l->t('Library %s with a version higher than %s is required - available version %s.',
array($libName, $minVersion, $libVersion))); array($libName, $minVersion, $libVersion));
} }
} }
if (isset($lib['@attributes']['max-version'])) { if (isset($lib['@attributes']['max-version'])) {
$maxVersion = $lib['@attributes']['max-version']; $maxVersion = $lib['@attributes']['max-version'];
if (version_compare($libVersion, $maxVersion, '>')) { if (version_compare($libVersion, $maxVersion, '>')) {
$this->addMissing((string)$this->l->t('Library %s with a version lower than %s is required - available version %s.', $missing[] = (string)$this->l->t('Library %s with a version lower than %s is required - available version %s.',
array($libName, $maxVersion, $libVersion))); array($libName, $maxVersion, $libVersion));
} }
} }
} }
} }
return $missing;
} }
private function analyzeOS() { private function analyzeOS($dependencies) {
if (!isset($this->dependencies['os'])) { $missing = [];
return; if (!isset($dependencies['os'])) {
return $missing;
} }
$oss = $this->dependencies['os']; $oss = $dependencies['os'];
if (empty($oss)) { if (empty($oss)) {
return; return $missing;
} }
if (is_array($oss)) { if (is_array($oss)) {
$oss = array_map(function ($os) { $oss = array_map(function ($os) {
@ -166,34 +170,37 @@ class DependencyAnalyzer {
} }
$currentOS = $this->platform->getOS(); $currentOS = $this->platform->getOS();
if (!in_array($currentOS, $oss)) { if (!in_array($currentOS, $oss)) {
$this->addMissing((string)$this->l->t('Following platforms are supported: %s', join(', ', $oss))); $missing[] = (string)$this->l->t('Following platforms are supported: %s', join(', ', $oss));
} }
return $missing;
} }
private function analyzeOC() { private function analyzeOC($dependencies, $appInfo) {
$missing = [];
$minVersion = null; $minVersion = null;
if (isset($this->dependencies['owncloud']['@attributes']['min-version'])) { if (isset($dependencies['owncloud']['@attributes']['min-version'])) {
$minVersion = $this->dependencies['owncloud']['@attributes']['min-version']; $minVersion = $dependencies['owncloud']['@attributes']['min-version'];
} elseif (isset($this->appInfo['requiremin'])) { } elseif (isset($appInfo['requiremin'])) {
$minVersion = $this->appInfo['requiremin']; $minVersion = $appInfo['requiremin'];
} }
$maxVersion = null; $maxVersion = null;
if (isset($this->dependencies['owncloud']['@attributes']['max-version'])) { if (isset($dependencies['owncloud']['@attributes']['max-version'])) {
$maxVersion = $this->dependencies['owncloud']['@attributes']['max-version']; $maxVersion = $dependencies['owncloud']['@attributes']['max-version'];
} elseif (isset($this->appInfo['requiremax'])) { } elseif (isset($appInfo['requiremax'])) {
$maxVersion = $this->appInfo['requiremax']; $maxVersion = $appInfo['requiremax'];
} }
if (!is_null($minVersion)) { if (!is_null($minVersion)) {
if (version_compare($this->platform->getOcVersion(), $minVersion, '<')) { if (version_compare($this->platform->getOcVersion(), $minVersion, '<')) {
$this->addMissing((string)$this->l->t('ownCloud %s or higher is required.', $minVersion)); $missing[] = (string)$this->l->t('ownCloud %s or higher is required.', $minVersion);
} }
} }
if (!is_null($maxVersion)) { if (!is_null($maxVersion)) {
if (version_compare($this->platform->getOcVersion(), $maxVersion, '>')) { if (version_compare($this->platform->getOcVersion(), $maxVersion, '>')) {
$this->addMissing((string)$this->l->t('ownCloud with a version lower than %s is required.', $maxVersion)); $missing[] = (string)$this->l->t('ownCloud with a version lower than %s is required.', $maxVersion);
} }
} }
return $missing;
} }
/** /**
@ -205,11 +212,4 @@ class DependencyAnalyzer {
return $element['@value']; return $element['@value'];
return (string)$element; return (string)$element;
} }
/**
* @param $minVersion
*/
private function addMissing($message) {
$this->missing[] = $message;
}
} }

View File

@ -118,7 +118,8 @@ class AppSettingsController extends Controller {
} }
// fix groups to be an array // fix groups to be an array
$apps = array_map(function($app){ $dependencyAnalyzer = new DependencyAnalyzer(new Platform($this->config), $this->l10n);
$apps = array_map(function($app) use ($dependencyAnalyzer) {
$groups = array(); $groups = array();
if (is_string($app['groups'])) { if (is_string($app['groups'])) {
$groups = json_decode($app['groups']); $groups = json_decode($app['groups']);
@ -127,8 +128,7 @@ class AppSettingsController extends Controller {
$app['canUnInstall'] = !$app['active'] && $app['removable']; $app['canUnInstall'] = !$app['active'] && $app['removable'];
// analyse dependencies // analyse dependencies
$dependencyAnalyzer = new DependencyAnalyzer($app, new Platform($this->config), $this->l10n); $missing = $dependencyAnalyzer->analyze($app);
$missing = $dependencyAnalyzer->analyze();
$app['canInstall'] = empty($missing); $app['canInstall'] = empty($missing);
$app['missingDependencies'] = $missing; $app['missingDependencies'] = $missing;

View File

@ -15,16 +15,15 @@ use OCP\IL10N;
class DependencyAnalyzer extends \PHPUnit_Framework_TestCase { class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
/** /** @var Platform */
* @var Platform
*/
private $platformMock; private $platformMock;
/** /** @var IL10N */
* @var IL10N
*/
private $l10nMock; private $l10nMock;
/** @var \OC\App\DependencyAnalyzer */
private $analyser;
public function setUp() { public function setUp() {
$this->platformMock = $this->getMockBuilder('\OC\App\Platform') $this->platformMock = $this->getMockBuilder('\OC\App\Platform')
->disableOriginalConstructor() ->disableOriginalConstructor()
@ -63,6 +62,8 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
->will($this->returnCallback(function($text, $parameters = array()) { ->will($this->returnCallback(function($text, $parameters = array()) {
return vsprintf($text, $parameters); return vsprintf($text, $parameters);
})); }));
$this->analyser = new \OC\App\DependencyAnalyzer($this->platformMock, $this->l10nMock);
} }
/** /**
@ -80,8 +81,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
if (!is_null($maxVersion)) { if (!is_null($maxVersion)) {
$app['dependencies']['php']['@attributes']['max-version'] = $maxVersion; $app['dependencies']['php']['@attributes']['max-version'] = $maxVersion;
} }
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock); $missing = $this->analyser->analyze($app);
$missing = $analyser->analyze();
$this->assertTrue(is_array($missing)); $this->assertTrue(is_array($missing));
$this->assertEquals($expectedMissing, $missing); $this->assertEquals($expectedMissing, $missing);
@ -98,8 +98,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
if (!is_null($databases)) { if (!is_null($databases)) {
$app['dependencies']['database'] = $databases; $app['dependencies']['database'] = $databases;
} }
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock); $missing = $this->analyser->analyze($app);
$missing = $analyser->analyze();
$this->assertTrue(is_array($missing)); $this->assertTrue(is_array($missing));
$this->assertEquals($expectedMissing, $missing); $this->assertEquals($expectedMissing, $missing);
@ -116,8 +115,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
if (!is_null($commands)) { if (!is_null($commands)) {
$app['dependencies']['command'] = $commands; $app['dependencies']['command'] = $commands;
} }
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock); $missing = $this->analyser->analyze($app);
$missing = $analyser->analyze();
$this->assertTrue(is_array($missing)); $this->assertTrue(is_array($missing));
$this->assertEquals($expectedMissing, $missing); $this->assertEquals($expectedMissing, $missing);
@ -137,8 +135,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
$app['dependencies']['lib'] = $libs; $app['dependencies']['lib'] = $libs;
} }
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock); $missing = $this->analyser->analyze($app);
$missing = $analyser->analyze();
$this->assertTrue(is_array($missing)); $this->assertTrue(is_array($missing));
$this->assertEquals($expectedMissing, $missing); $this->assertEquals($expectedMissing, $missing);
@ -157,8 +154,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
$app['dependencies']['os'] = $oss; $app['dependencies']['os'] = $oss;
} }
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock); $missing = $this->analyser->analyze($app);
$missing = $analyser->analyze();
$this->assertTrue(is_array($missing)); $this->assertTrue(is_array($missing));
$this->assertEquals($expectedMissing, $missing); $this->assertEquals($expectedMissing, $missing);
@ -177,8 +173,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
$app['dependencies']['owncloud'] = $oc; $app['dependencies']['owncloud'] = $oc;
} }
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock); $missing = $this->analyser->analyze($app);
$missing = $analyser->analyze();
$this->assertTrue(is_array($missing)); $this->assertTrue(is_array($missing));
$this->assertEquals($expectedMissing, $missing); $this->assertEquals($expectedMissing, $missing);