Ver Fonte

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

Jordi Boggiano há 13 anos atrás
pai
commit
f6b9488bf0

+ 1 - 1
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

+ 15 - 26
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;

+ 63 - 0
src/Composer/Package/Loader/RootPackageLoader.php

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

+ 0 - 9
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}
      */

+ 1 - 1
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));

+ 1 - 1
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));
         }

+ 1 - 1
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);

+ 1 - 1
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;
 

+ 0 - 7
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);
 }

+ 0 - 3
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;
     }
 

+ 1 - 1
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())) {

+ 1 - 5
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');

+ 1 - 2
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()

+ 0 - 4
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())