Move root package handling to a dedicated loader and make ArrayLoader more strict

main
Jordi Boggiano 13 years ago committed by Nils Adermann
parent a2caa7c5e6
commit f6b9488bf0

@ -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

@ -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;

@ -0,0 +1,63 @@
<?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\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 <j.boggiano@seld.be>
*/
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;
}
}

@ -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}
*/

@ -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));

@ -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));
}

@ -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);

@ -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;

@ -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);
}

@ -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;
}

@ -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())) {

@ -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');

@ -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()

@ -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())

Loading…
Cancel
Save