From f6b9488bf07cb8c255658eabe2b9cc275d5f65e3 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 12 Dec 2011 21:46:21 +0100 Subject: [PATCH] Move root package handling to a dedicated loader and make ArrayLoader more strict --- src/Composer/Console/Application.php | 2 +- src/Composer/Package/Loader/ArrayLoader.php | 41 +++++------- .../Package/Loader/RootPackageLoader.php | 63 +++++++++++++++++++ src/Composer/Repository/ArrayRepository.php | 9 --- .../Repository/ComposerRepository.php | 2 +- .../Repository/FilesystemRepository.php | 2 +- src/Composer/Repository/PackageRepository.php | 2 +- src/Composer/Repository/PearRepository.php | 2 +- .../Repository/RepositoryInterface.php | 7 --- src/Composer/Repository/RepositoryManager.php | 3 - src/Composer/Repository/VcsRepository.php | 2 +- .../Test/Installer/InstallerInstallerTest.php | 6 +- .../Test/Package/Loader/ArrayLoaderTest.php | 3 +- .../Repository/FilesystemRepositoryTest.php | 4 -- 14 files changed, 86 insertions(+), 62 deletions(-) create mode 100644 src/Composer/Package/Loader/RootPackageLoader.php diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index b58a473b2..35af5dd79 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -142,7 +142,7 @@ class Application extends BaseApplication $im->addInstaller(new Installer\InstallerInstaller($vendorDir, $binDir, $dm, $rm->getLocalRepository(), $im)); // load package - $loader = new Package\Loader\ArrayLoader($rm); + $loader = new Package\Loader\RootPackageLoader($rm); $package = $loader->load($packageConfig); // load default repository unless it's explicitly disabled diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 9464e9f16..183818826 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -13,6 +13,7 @@ namespace Composer\Package\Loader; use Composer\Package; +use Composer\Package\Version\VersionParser; use Composer\Repository\RepositoryManager; /** @@ -31,49 +32,37 @@ class ArrayLoader ); protected $versionParser; - private $manager; - public function __construct(RepositoryManager $manager, $parser = null) + public function __construct(VersionParser $parser = null) { - $this->manager = $manager; - $this->versionParser = $parser; if (!$parser) { - $this->versionParser = new Package\Version\VersionParser; + $parser = new VersionParser; } + $this->versionParser = $parser; } public function load($config) { - $prettyVersion = isset($config['version']) ? $config['version'] : '0.0.0'; + if (!isset($config['name'])) { + throw new \UnexpectedValueException('Unknown package has no name defined ('.json_encode($config).').'); + } + if (!isset($config['version'])) { + throw new \UnexpectedValueException('Package '.$config['name'].' has no version defined.'); + } + // handle already normalized versions if (isset($config['version_normalized'])) { $version = $config['version_normalized']; } else { - $version = $this->versionParser->normalize($prettyVersion); + $version = $this->versionParser->normalize($config['version']); } - $package = new Package\MemoryPackage(isset($config['name']) ? $config['name'] : '__app__', $version, $prettyVersion); - - $package->setType(isset($config['type']) ? $config['type'] : 'library'); + $package = new Package\MemoryPackage($config['name'], $version, $config['version']); + $package->setType(isset($config['type']) ? strtolower($config['type']) : 'library'); if (isset($config['target-dir'])) { $package->setTargetDir($config['target-dir']); } - if (isset($config['repositories'])) { - $repositories = array(); - foreach ($config['repositories'] as $repoName => $repo) { - if (false === $repo && 'packagist' === $repoName) { - continue; - } - if (!is_array($repo)) { - throw new \UnexpectedValueException('Repository '.$repoName.' in '.$package->getPrettyName().' '.$package->getVersion().' should be an array, '.gettype($repo).' given'); - } - $repository = $this->manager->createRepository(key($repo), current($repo)); - $this->manager->addRepository($repository); - } - $package->setRepositories($config['repositories']); - } - if (isset($config['extra']) && is_array($config['extra'])) { $package->setExtra($config['extra']); } @@ -167,7 +156,7 @@ class ArrayLoader $constraint = $package->getPrettyVersion(); } $parsedConstraint = $this->versionParser->parseConstraints($constraint); - $links[] = new Package\Link($package->getName(), $packageName, $parsedConstraint, $description, $constraint); + $links[] = new Package\Link($package->getName(), $packageName, $parsedConstraint, $description, $constraint); } return $links; diff --git a/src/Composer/Package/Loader/RootPackageLoader.php b/src/Composer/Package/Loader/RootPackageLoader.php new file mode 100644 index 000000000..1ce78cc82 --- /dev/null +++ b/src/Composer/Package/Loader/RootPackageLoader.php @@ -0,0 +1,63 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Package\Loader; + +use Composer\Package\Version\VersionParser; +use Composer\Repository\RepositoryManager; + +/** + * ArrayLoader built for the sole purpose of loading the root package + * + * Sets additional defaults and loads repositories + * + * @author Jordi Boggiano + */ +class RootPackageLoader extends ArrayLoader +{ + private $manager; + + public function __construct(RepositoryManager $manager, VersionParser $parser = null) + { + $this->manager = $manager; + parent::__construct($parser); + } + + public function load($config) + { + if (!isset($config['name'])) { + $config['name'] = '__root__'; + } + if (!isset($config['version'])) { + $config['version'] = '1.0.0-dev'; + } + + $package = parent::load($config); + + if (isset($config['repositories'])) { + $repositories = array(); + foreach ($config['repositories'] as $repoName => $repo) { + if (false === $repo && 'packagist' === $repoName) { + continue; + } + if (!is_array($repo)) { + throw new \UnexpectedValueException('Repository '.$repoName.' in '.$package->getPrettyName().' '.$package->getVersion().' should be an array, '.gettype($repo).' given'); + } + $repository = $this->manager->createRepository(key($repo), current($repo)); + $this->manager->addRepository($repository); + } + $package->setRepositories($config['repositories']); + } + + return $package; + } +} diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index cf6e3c1ac..06910bbe3 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -23,7 +23,6 @@ use Composer\Package\Version\VersionParser; class ArrayRepository implements RepositoryInterface { protected $packages; - protected $repositoryManager; /** * {@inheritDoc} @@ -42,14 +41,6 @@ class ArrayRepository implements RepositoryInterface } } - /** - * {@inheritDoc} - */ - public function setRepositoryManager(RepositoryManager $manager) - { - $this->repositoryManager = $manager; - } - /** * {@inheritDoc} */ diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index be1fd469b..fadfd6a7c 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -47,7 +47,7 @@ class ComposerRepository extends ArrayRepository throw new \UnexpectedValueException('Could not parse package list from the '.$this->url.' repository'); } - $loader = new ArrayLoader($this->repositoryManager); + $loader = new ArrayLoader(); foreach ($packages as $data) { foreach ($data['versions'] as $rev) { $this->addPackage($loader->load($rev)); diff --git a/src/Composer/Repository/FilesystemRepository.php b/src/Composer/Repository/FilesystemRepository.php index 525f71921..73fc37305 100644 --- a/src/Composer/Repository/FilesystemRepository.php +++ b/src/Composer/Repository/FilesystemRepository.php @@ -53,7 +53,7 @@ class FilesystemRepository extends ArrayRepository implements WritableRepository throw new \UnexpectedValueException('Could not parse package list from the '.$this->file->getPath().' repository'); } - $loader = new ArrayLoader($this->repositoryManager); + $loader = new ArrayLoader(); foreach ($packages as $package) { $this->addPackage($loader->load($package)); } diff --git a/src/Composer/Repository/PackageRepository.php b/src/Composer/Repository/PackageRepository.php index 50779ab37..01b1b24c2 100644 --- a/src/Composer/Repository/PackageRepository.php +++ b/src/Composer/Repository/PackageRepository.php @@ -47,7 +47,7 @@ class PackageRepository extends ArrayRepository $this->config = array($this->config); } - $loader = new ArrayLoader($this->repositoryManager); + $loader = new ArrayLoader(); foreach ($this->config as $package) { $package = $loader->load($package); $this->addPackage($package); diff --git a/src/Composer/Repository/PearRepository.php b/src/Composer/Repository/PearRepository.php index cf07a3cc6..b19620b3a 100644 --- a/src/Composer/Repository/PearRepository.php +++ b/src/Composer/Repository/PearRepository.php @@ -56,7 +56,7 @@ class PearRepository extends ArrayRepository $packagesXML = $this->requestXml($this->url . $categoryLink); $packages = $packagesXML->getElementsByTagName('p'); - $loader = new ArrayLoader($this->repositoryManager); + $loader = new ArrayLoader(); foreach ($packages as $package) { $packageName = $package->nodeValue; diff --git a/src/Composer/Repository/RepositoryInterface.php b/src/Composer/Repository/RepositoryInterface.php index 609aed2fb..a94ecea4c 100644 --- a/src/Composer/Repository/RepositoryInterface.php +++ b/src/Composer/Repository/RepositoryInterface.php @@ -47,11 +47,4 @@ interface RepositoryInterface extends \Countable * @return array */ function getPackages(); - - /** - * Stores the RepositoryManager owning this repository - * - * @param RepositoryManager $manager - */ - function setRepositoryManager(RepositoryManager $manager); } diff --git a/src/Composer/Repository/RepositoryManager.php b/src/Composer/Repository/RepositoryManager.php index 9aceed152..1bcc1feaa 100644 --- a/src/Composer/Repository/RepositoryManager.php +++ b/src/Composer/Repository/RepositoryManager.php @@ -59,8 +59,6 @@ class RepositoryManager { $this->repositories[] = $repository; - $repository->setRepositoryManager($this); - // already initialized, so initialize new repos on the fly if ($this->initialized) { $repository->getPackages(); @@ -120,7 +118,6 @@ class RepositoryManager */ public function setLocalRepository(RepositoryInterface $repository) { - $repository->setRepositoryManager($this); $this->localRepository = $repository; } diff --git a/src/Composer/Repository/VcsRepository.php b/src/Composer/Repository/VcsRepository.php index b69253b35..9b66963bc 100644 --- a/src/Composer/Repository/VcsRepository.php +++ b/src/Composer/Repository/VcsRepository.php @@ -69,7 +69,7 @@ class VcsRepository extends ArrayRepository } $versionParser = new VersionParser; - $loader = new ArrayLoader($this->repositoryManager); + $loader = new ArrayLoader(); $versions = array(); if ($driver->hasComposerFile($driver->getRootIdentifier())) { diff --git a/tests/Composer/Test/Installer/InstallerInstallerTest.php b/tests/Composer/Test/Installer/InstallerInstallerTest.php index 2ca75b5cd..0c1d24f75 100644 --- a/tests/Composer/Test/Installer/InstallerInstallerTest.php +++ b/tests/Composer/Test/Installer/InstallerInstallerTest.php @@ -20,11 +20,7 @@ class InstallerInstallerTest extends \PHPUnit_Framework_TestCase { protected function setUp() { - $repositoryManager = $this->getMockBuilder('Composer\Repository\RepositoryManager') - ->disableOriginalConstructor() - ->getMock(); - - $loader = new JsonLoader($repositoryManager); + $loader = new JsonLoader(); $this->packages = array(); for ($i = 1; $i <= 3; $i++) { $this->packages[] = $loader->load(__DIR__.'/Fixtures/installer-v'.$i.'/composer.json'); diff --git a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php index 025cb140a..98c595243 100644 --- a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php @@ -18,8 +18,7 @@ class ArrayLoaderTest extends \PHPUnit_Framework_TestCase { public function setUp() { - $this->manager = $this->getMock('Composer\Repository\RepositoryManager'); - $this->loader = new ArrayLoader($this->manager); + $this->loader = new ArrayLoader(); } public function testSelfVersion() diff --git a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php index 082f9b0f4..c9abcdb76 100644 --- a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php +++ b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php @@ -22,7 +22,6 @@ class FilesystemRepositoryTest extends TestCase $json = $this->createJsonFileMock(); $repository = new FilesystemRepository($json); - $repository->setRepositoryManager($this->getMock('Composer\Repository\RepositoryManager')); $json ->expects($this->once()) @@ -51,7 +50,6 @@ class FilesystemRepositoryTest extends TestCase $json = $this->createJsonFileMock(); $repository = new FilesystemRepository($json); - $repository->setRepositoryManager($this->getMock('Composer\Repository\RepositoryManager')); $json ->expects($this->once()) @@ -70,7 +68,6 @@ class FilesystemRepositoryTest extends TestCase $json = $this->createJsonFileMock(); $repository = new FilesystemRepository($json); - $repository->setRepositoryManager($this->getMock('Composer\Repository\RepositoryManager')); $json ->expects($this->once()) @@ -85,7 +82,6 @@ class FilesystemRepositoryTest extends TestCase $json = $this->createJsonFileMock(); $repository = new FilesystemRepository($json); - $repository->setRepositoryManager($this->getMock('Composer\Repository\RepositoryManager')); $json ->expects($this->once())