Implement a plugin manager and interface, update installer plugin tests
parent
01a08a2ff3
commit
eb966d347f
|
@ -16,6 +16,7 @@ use Composer\Package\RootPackageInterface;
|
|||
use Composer\Package\Locker;
|
||||
use Composer\Repository\RepositoryManager;
|
||||
use Composer\Installer\InstallationManager;
|
||||
use Composer\Plugin\PluginManager;
|
||||
use Composer\Downloader\DownloadManager;
|
||||
use Composer\Script\EventDispatcher;
|
||||
use Composer\Autoload\AutoloadGenerator;
|
||||
|
@ -53,6 +54,11 @@ class Composer
|
|||
*/
|
||||
private $installationManager;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private $pluginManager;
|
||||
|
||||
/**
|
||||
* @var Config
|
||||
*/
|
||||
|
@ -165,6 +171,22 @@ class Composer
|
|||
return $this->installationManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Plugin\PluginManager $manager
|
||||
*/
|
||||
public function setPluginManager(PluginManager $manager)
|
||||
{
|
||||
$this->pluginManager = $manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Plugin\PluginManager
|
||||
*/
|
||||
public function getPluginManager()
|
||||
{
|
||||
return $this->pluginManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Script\EventDispatcher $eventDispatcher
|
||||
*/
|
||||
|
|
|
@ -264,6 +264,10 @@ class Factory
|
|||
$composer->setLocker($locker);
|
||||
}
|
||||
|
||||
$pm = $this->createPluginManager($composer);
|
||||
|
||||
$composer->setPluginManager($pm);
|
||||
|
||||
return $composer;
|
||||
}
|
||||
|
||||
|
@ -353,6 +357,14 @@ class Factory
|
|||
return $am;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Plugin\PluginManager
|
||||
*/
|
||||
protected function createPluginManager(Composer $composer)
|
||||
{
|
||||
return new Plugin\PluginManager($composer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Installer\InstallationManager
|
||||
*/
|
||||
|
|
|
@ -29,7 +29,7 @@ class PluginInstaller extends LibraryInstaller
|
|||
private static $classCounter = 0;
|
||||
|
||||
/**
|
||||
* Initializes Installer installer.
|
||||
* Initializes Plugin installer.
|
||||
*
|
||||
* @param IOInterface $io
|
||||
* @param Composer $composer
|
||||
|
@ -42,11 +42,8 @@ class PluginInstaller extends LibraryInstaller
|
|||
|
||||
$repo = $composer->getRepositoryManager()->getLocalRepository();
|
||||
foreach ($repo->getPackages() as $package) {
|
||||
if ('composer-installer' === $package->getType()) {
|
||||
$this->registerInstaller($package);
|
||||
}
|
||||
if ('composer-plugin' === $package->getType()) {
|
||||
$this->registerInstaller($package);
|
||||
if ('composer-plugin' === $package->getType() || 'composer-installer' === $package->getType()) {
|
||||
$this->registerPlugin($package);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +59,7 @@ class PluginInstaller extends LibraryInstaller
|
|||
}
|
||||
|
||||
parent::install($repo, $package);
|
||||
$this->registerInstaller($package);
|
||||
$this->registerPlugin($package);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -76,11 +73,13 @@ class PluginInstaller extends LibraryInstaller
|
|||
}
|
||||
|
||||
parent::update($repo, $initial, $target);
|
||||
$this->registerInstaller($target);
|
||||
$this->registerPlugin($target);
|
||||
}
|
||||
|
||||
private function registerInstaller(PackageInterface $package)
|
||||
private function registerPlugin(PackageInterface $package)
|
||||
{
|
||||
$oldInstallerPlugin = ($package->getType() === 'composer-installer');
|
||||
|
||||
$downloadPath = $this->getInstallPath($package);
|
||||
|
||||
$extra = $package->getExtra();
|
||||
|
@ -100,8 +99,13 @@ class PluginInstaller extends LibraryInstaller
|
|||
self::$classCounter++;
|
||||
}
|
||||
|
||||
$installer = new $class($this->io, $this->composer);
|
||||
$this->installationManager->addInstaller($installer);
|
||||
$plugin = new $class($this->io, $this->composer);
|
||||
|
||||
if ($oldInstallerPlugin) {
|
||||
$this->installationManager->addInstaller($installer);
|
||||
} else {
|
||||
$this->composer->getPluginManager()->addPlugin($plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Plugin;
|
||||
|
||||
use Composer\Composer;
|
||||
|
||||
/**
|
||||
* Plugin interface
|
||||
*
|
||||
* @author Nils Adermann <naderman@naderman.de>
|
||||
*/
|
||||
interface PluginInterface
|
||||
{
|
||||
/**
|
||||
* Apply plugin modifications to the passed in composer object
|
||||
*
|
||||
* @param Composer $composer
|
||||
*/
|
||||
public function activate(Composer $composer);
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Plugin;
|
||||
|
||||
use Composer\Composer;
|
||||
use Composer\Package\PackageInterface;
|
||||
|
||||
/**
|
||||
* Plugin manager
|
||||
*
|
||||
* @author Nils Adermann <naderman@naderman.de>
|
||||
*/
|
||||
class PluginManager
|
||||
{
|
||||
protected $composer;
|
||||
|
||||
protected $plugins = array();
|
||||
|
||||
/**
|
||||
* Initializes plugin manager
|
||||
*
|
||||
* @param Composer $composer
|
||||
*/
|
||||
public function __construct(Composer $composer)
|
||||
{
|
||||
$this->composer = $composer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds plugin
|
||||
*
|
||||
* @param PluginInterface $plugin plugin instance
|
||||
*/
|
||||
public function addPlugin(PluginInterface $plugin)
|
||||
{
|
||||
$this->plugins[] = $plugin;
|
||||
$plugin->activate($this->composer);
|
||||
}
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Installer\InstallerInterface;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Repository\InstalledRepositoryInterface;
|
||||
|
||||
class Custom implements InstallerInterface
|
||||
{
|
||||
public $version = 'installer-v1';
|
||||
|
||||
public function supports($packageType) {}
|
||||
public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function install(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {}
|
||||
public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function getInstallPath(PackageInterface $package) {}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
class Exception extends \Exception
|
||||
{
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Composer;
|
||||
use Composer\Plugin\PluginInterface;
|
||||
|
||||
class Plugin implements PluginInterface
|
||||
{
|
||||
public $version = 'installer-v1';
|
||||
|
||||
public function activate(Composer $composer)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,6 +4,6 @@
|
|||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": "Installer\\Custom"
|
||||
"class": "Installer\\Plugin"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Installer\InstallerInterface;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Repository\InstalledRepositoryInterface;
|
||||
|
||||
class Custom2 implements InstallerInterface
|
||||
{
|
||||
public $version = 'installer-v2';
|
||||
|
||||
public function supports($packageType) {}
|
||||
public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function install(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {}
|
||||
public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function getInstallPath(PackageInterface $package) {}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
class Exception extends \Exception
|
||||
{
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Composer;
|
||||
use Composer\Plugin\PluginInterface;
|
||||
|
||||
class Plugin2 implements PluginInterface
|
||||
{
|
||||
public $version = 'installer-v2';
|
||||
|
||||
public function activate(Composer $composer)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,6 +4,6 @@
|
|||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": "Installer\\Custom2"
|
||||
"class": "Installer\\Plugin2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Installer\InstallerInterface;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Repository\InstalledRepositoryInterface;
|
||||
|
||||
class Custom2 implements InstallerInterface
|
||||
{
|
||||
public $version = 'installer-v3';
|
||||
|
||||
public function supports($packageType) {}
|
||||
public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function install(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {}
|
||||
public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function getInstallPath(PackageInterface $package) {}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
class Exception extends \Exception
|
||||
{
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Composer;
|
||||
use Composer\Plugin\PluginInterface;
|
||||
|
||||
class Plugin2 implements PluginInterface
|
||||
{
|
||||
public $version = 'installer-v3';
|
||||
|
||||
public function activate(Composer $composer)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,6 +4,6 @@
|
|||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": "Installer\\Custom2"
|
||||
"class": "Installer\\Plugin2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Installer\InstallerInterface;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Repository\InstalledRepositoryInterface;
|
||||
|
||||
class Custom1 implements InstallerInterface
|
||||
{
|
||||
public $name = 'custom1';
|
||||
public $version = 'installer-v4';
|
||||
|
||||
public function supports($packageType) {}
|
||||
public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function install(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {}
|
||||
public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function getInstallPath(PackageInterface $package) {}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Installer\InstallerInterface;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Repository\InstalledRepositoryInterface;
|
||||
|
||||
class Custom2 implements InstallerInterface
|
||||
{
|
||||
public $name = 'custom2';
|
||||
public $version = 'installer-v4';
|
||||
|
||||
public function supports($packageType) {}
|
||||
public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function install(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {}
|
||||
public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) {}
|
||||
public function getInstallPath(PackageInterface $package) {}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Composer;
|
||||
use Composer\Plugin\PluginInterface;
|
||||
|
||||
class Plugin1 implements PluginInterface
|
||||
{
|
||||
public $name = 'plugin1';
|
||||
public $version = 'installer-v4';
|
||||
|
||||
public function activate(Composer $composer)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace Installer;
|
||||
|
||||
use Composer\Composer;
|
||||
use Composer\Plugin\PluginInterface;
|
||||
|
||||
class Plugin2 implements PluginInterface
|
||||
{
|
||||
public $name = 'plugin2';
|
||||
public $version = 'installer-v4';
|
||||
|
||||
public function activate(Composer $composer)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -5,8 +5,8 @@
|
|||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": [
|
||||
"Installer\\Custom1",
|
||||
"Installer\\Custom2"
|
||||
"Installer\\Plugin1",
|
||||
"Installer\\Plugin2"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
protected $composer;
|
||||
protected $packages;
|
||||
protected $im;
|
||||
protected $pm;
|
||||
protected $repository;
|
||||
protected $io;
|
||||
protected $autoloadGenerator;
|
||||
|
@ -45,6 +46,10 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->pm = $this->getMockBuilder('Composer\Plugin\PluginManager')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repository = $this->getMock('Composer\Repository\InstalledRepositoryInterface');
|
||||
|
||||
$rm = $this->getMockBuilder('Composer\Repository\RepositoryManager')
|
||||
|
@ -64,6 +69,7 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
$this->composer->setConfig($config);
|
||||
$this->composer->setDownloadManager($dm);
|
||||
$this->composer->setInstallationManager($this->im);
|
||||
$this->composer->setPluginManager($this->pm);
|
||||
$this->composer->setRepositoryManager($rm);
|
||||
$this->composer->setAutoloadGenerator($this->autoloadGenerator);
|
||||
|
||||
|
@ -75,7 +81,7 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
));
|
||||
}
|
||||
|
||||
public function testInstallNewInstaller()
|
||||
public function testInstallNewPlugin()
|
||||
{
|
||||
$this->repository
|
||||
->expects($this->once())
|
||||
|
@ -84,9 +90,9 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
$this->im
|
||||
$this->pm
|
||||
->expects($this->once())
|
||||
->method('addInstaller')
|
||||
->method('addPlugin')
|
||||
->will($this->returnCallback(function ($installer) use ($test) {
|
||||
$test->assertEquals('installer-v1', $installer->version);
|
||||
}));
|
||||
|
@ -94,7 +100,7 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
$installer->install($this->repository, $this->packages[0]);
|
||||
}
|
||||
|
||||
public function testInstallMultipleInstallers()
|
||||
public function testInstallMultiplePlugins()
|
||||
{
|
||||
$this->repository
|
||||
->expects($this->once())
|
||||
|
@ -105,20 +111,20 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
|
||||
$test = $this;
|
||||
|
||||
$this->im
|
||||
$this->pm
|
||||
->expects($this->at(0))
|
||||
->method('addInstaller')
|
||||
->will($this->returnCallback(function ($installer) use ($test) {
|
||||
$test->assertEquals('custom1', $installer->name);
|
||||
$test->assertEquals('installer-v4', $installer->version);
|
||||
->method('addPlugin')
|
||||
->will($this->returnCallback(function ($plugin) use ($test) {
|
||||
$test->assertEquals('plugin1', $plugin->name);
|
||||
$test->assertEquals('installer-v4', $plugin->version);
|
||||
}));
|
||||
|
||||
$this->im
|
||||
$this->pm
|
||||
->expects($this->at(1))
|
||||
->method('addInstaller')
|
||||
->will($this->returnCallback(function ($installer) use ($test) {
|
||||
$test->assertEquals('custom2', $installer->name);
|
||||
$test->assertEquals('installer-v4', $installer->version);
|
||||
->method('addPlugin')
|
||||
->will($this->returnCallback(function ($plugin) use ($test) {
|
||||
$test->assertEquals('plugin2', $plugin->name);
|
||||
$test->assertEquals('installer-v4', $plugin->version);
|
||||
}));
|
||||
|
||||
$installer->install($this->repository, $this->packages[3]);
|
||||
|
@ -137,11 +143,11 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
$this->im
|
||||
$this->pm
|
||||
->expects($this->once())
|
||||
->method('addInstaller')
|
||||
->will($this->returnCallback(function ($installer) use ($test) {
|
||||
$test->assertEquals('installer-v2', $installer->version);
|
||||
->method('addPlugin')
|
||||
->will($this->returnCallback(function ($plugin) use ($test) {
|
||||
$test->assertEquals('installer-v2', $plugin->version);
|
||||
}));
|
||||
|
||||
$installer->update($this->repository, $this->packages[0], $this->packages[1]);
|
||||
|
@ -160,11 +166,11 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
$this->im
|
||||
$this->pm
|
||||
->expects($this->once())
|
||||
->method('addInstaller')
|
||||
->will($this->returnCallback(function ($installer) use ($test) {
|
||||
$test->assertEquals('installer-v3', $installer->version);
|
||||
->method('addPlugin')
|
||||
->will($this->returnCallback(function ($plugin) use ($test) {
|
||||
$test->assertEquals('installer-v3', $plugin->version);
|
||||
}));
|
||||
|
||||
$installer->update($this->repository, $this->packages[1], $this->packages[2]);
|
||||
|
|
Loading…
Reference in New Issue