Implement a plugin manager and interface, update installer plugin tests

main
Nils Adermann 11 years ago
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…
Cancel
Save