diff --git a/src/composer.json b/src/composer.json index a6716fcb..4c7c748d 100644 --- a/src/composer.json +++ b/src/composer.json @@ -25,7 +25,8 @@ "symfony/yaml": "2.5.*", "symfony/translation": "2.5.*", "tedivm/stash": "0.12.*", - "canteen/html5": "1.1.*" + "canteen/html5": "1.1.*", + "vierbergenlars/php-semver": "3.0.*" }, "require-dev": { "squizlabs/php_codesniffer": "1.*" diff --git a/src/mibew/libs/classes/Mibew/Plugin/Manager.php b/src/mibew/libs/classes/Mibew/Plugin/Manager.php index d7235cde..7be7f2eb 100644 --- a/src/mibew/libs/classes/Mibew/Plugin/Manager.php +++ b/src/mibew/libs/classes/Mibew/Plugin/Manager.php @@ -19,6 +19,9 @@ namespace Mibew\Plugin; +use vierbergenlars\SemVer\version as Version; +use vierbergenlars\SemVer\expression as VersionExpression; + /** * Manage plugins */ @@ -141,12 +144,13 @@ class Manager continue 2; } + $version_constrain = new VersionExpression($required_version); $dependency_version = call_user_func(array( self::$loadedPlugins[$dependency], 'getVersion' )); - if ($required_version !== $dependency_version) { + if (!$version_constrain->satisfiedBy(new Version($dependency_version))) { $error_message = "Plugin '{$dependency}' has version " . "incompatible with '{$plugin_name}' requirements!"; trigger_error($error_message, E_USER_WARNING); diff --git a/src/mibew/libs/classes/Mibew/Plugin/PluginInterface.php b/src/mibew/libs/classes/Mibew/Plugin/PluginInterface.php index dee93479..cfcd9c8a 100644 --- a/src/mibew/libs/classes/Mibew/Plugin/PluginInterface.php +++ b/src/mibew/libs/classes/Mibew/Plugin/PluginInterface.php @@ -61,8 +61,22 @@ interface PluginInterface * Returns list of plugin's dependencies. * * Each key in the array is a string with a plugin name. Each value is - * required plugin version. If the plugin have no dependencies an empty - * array should be returned. + * plugin version constrain. A constrain can be in one of the following + * formats: + * - "1.2.3": exact version number; + * - ">1.2.3": grater than a specific version; + * - ">=1.2.3": greater than a specific version or equal to it; + * - "<1.2.3": less than a specific version; + * - "<=1.2.3": less than a specific version or equal to it; + * - "1.2.3 - 2.3.4": equals to ">=1.2.3 <=2.3.4"; + * - "~1.2.3": equivalent for ">=1.2.3 <1.3.0"; + * - "~1.2": equivalent for ">=1.2.0 <2.0.0"; + * - "^1.2.3" equivalent for ">=1.2.3 <2.0.0"; + * - "^0.1.2" equivalent for ">=0.1.2 <0.2.0"; + * - "1.2.x": equivalent for ">=1.2.0 <2.0.0"; + * - "1.x": equivalent for ">=1.0.0 <2.0.0"; + * + * If the plugin have no dependencies an empty array should be returned. * * @return array List of plugin's dependencies. */