mirror of
https://github.com/composer/composer
synced 2025-05-09 08:32:56 +00:00
Merge branches 'add_exclude' and 'master' of https://github.com/trivago/composer into add_exclude
* 'add_exclude' of https://github.com/trivago/composer: # By Jordi Boggiano (239) and others # Via Jordi Boggiano (184) and others * 'master' of https://github.com/trivago/composer: (638 commits) Simplified syntax github deprecation changes fix bug in GitDriver::supports for remote repo strict check, testcase(s) Fix regex matching and add more tests for addSubNode, refs #3721, fixes #3716 solve edge case for `composer remove vendor/pkg` chmod 644 src/Composer/Command/RemoveCommand.php Avoid failing on composer show of lazy providers Show more info when a download fails Add notion of autoloader skipping autoload-dev rules Satis grammar fix. remove unused statements removed needless output param + limit git ls-remote to heads + escape repo url add check for remote Repository in GitDriver::supports suppress the prefix Improve notice about /usr/local/bin Reuse current file permissions Add the P character to the regex pattern Added deprecated warning for the dev option ... Conflicts: src/Composer/Autoload/AutoloadGenerator.php src/Composer/Autoload/ClassMapGenerator.php
This commit is contained in:
commit
f28785a49d
268 changed files with 11600 additions and 3566 deletions
|
@ -19,18 +19,65 @@ use Composer\Package\AliasPackage;
|
|||
use Composer\Package\Package;
|
||||
use Composer\TestCase;
|
||||
use Composer\Script\ScriptEvents;
|
||||
use Composer\Repository\InstalledRepositoryInterface;
|
||||
use Composer\Installer\InstallationManager;
|
||||
use Composer\Config;
|
||||
use Composer\EventDispatcher\EventDispatcher;
|
||||
use PHPUnit_Framework_MockObject_MockObject as MockObject;
|
||||
|
||||
class AutoloadGeneratorTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $vendorDir;
|
||||
|
||||
/**
|
||||
* @var Config|MockObject
|
||||
*/
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $workingDir;
|
||||
|
||||
/**
|
||||
* @var InstallationManager|MockObject
|
||||
*/
|
||||
private $im;
|
||||
|
||||
/**
|
||||
* @var InstalledRepositoryInterface|MockObject
|
||||
*/
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* @var AutoloadGenerator
|
||||
*/
|
||||
private $generator;
|
||||
|
||||
/**
|
||||
* @var Filesystem
|
||||
*/
|
||||
private $fs;
|
||||
|
||||
/**
|
||||
* @var EventDispatcher|MockObject
|
||||
*/
|
||||
private $eventDispatcher;
|
||||
|
||||
/**
|
||||
* Map of setting name => return value configuration for the stub Config
|
||||
* object.
|
||||
*
|
||||
* Note: must be public for compatibility with PHP 5.3 runtimes where
|
||||
* closures cannot access private members of the classes they are created
|
||||
* in.
|
||||
* @var array
|
||||
*/
|
||||
public $configValueMap;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->fs = new Filesystem;
|
||||
|
@ -43,18 +90,23 @@ class AutoloadGeneratorTest extends TestCase
|
|||
|
||||
$this->config = $this->getMock('Composer\Config');
|
||||
|
||||
$this->config->expects($this->at(0))
|
||||
->method('get')
|
||||
->with($this->equalTo('vendor-dir'))
|
||||
->will($this->returnCallback(function () use ($that) {
|
||||
$this->configValueMap = array(
|
||||
'vendor-dir' => function () use ($that) {
|
||||
return $that->vendorDir;
|
||||
}));
|
||||
},
|
||||
);
|
||||
|
||||
$this->config->expects($this->at(1))
|
||||
$this->config->expects($this->atLeastOnce())
|
||||
->method('get')
|
||||
->with($this->equalTo('vendor-dir'))
|
||||
->will($this->returnCallback(function () use ($that) {
|
||||
return $that->vendorDir;
|
||||
->will($this->returnCallback(function ($arg) use ($that) {
|
||||
$ret = null;
|
||||
if (isset($that->configValueMap[$arg])) {
|
||||
$ret = $that->configValueMap[$arg];
|
||||
if (is_callable($ret)) {
|
||||
$ret = $ret();
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}));
|
||||
|
||||
$this->origDir = getcwd();
|
||||
|
@ -111,17 +163,19 @@ class AutoloadGeneratorTest extends TestCase
|
|||
->will($this->returnValue(array()));
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/composer');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/src');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/src/Lala');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/lib');
|
||||
file_put_contents($this->workingDir.'/src/Lala/ClassMapMain.php', '<?php namespace Lala; class ClassMapMain {}');
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/src-fruit');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/src-cake');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/lib-cake');
|
||||
file_put_contents($this->workingDir.'/src-cake/ClassMapBar.php', '<?php namespace Acme\Cake; class ClassMapBar {}');
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/composersrc');
|
||||
file_put_contents($this->workingDir.'/composersrc/foo.php', '<?php class ClassMapFoo {}');
|
||||
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, '_1');
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_1');
|
||||
|
||||
// Assert that autoload_namespaces.php was correctly generated.
|
||||
$this->assertAutoloadFiles('main', $this->vendorDir.'/composer');
|
||||
|
@ -133,6 +187,77 @@ class AutoloadGeneratorTest extends TestCase
|
|||
$this->assertAutoloadFiles('classmap', $this->vendorDir.'/composer', 'classmap');
|
||||
}
|
||||
|
||||
public function testMainPackageDevAutoloading()
|
||||
{
|
||||
$package = new Package('a', '1.0', '1.0');
|
||||
$package->setAutoload(array(
|
||||
'psr-0' => array(
|
||||
'Main' => 'src/',
|
||||
),
|
||||
));
|
||||
$package->setDevAutoload(array(
|
||||
'files' => array('devfiles/foo.php'),
|
||||
'psr-0' => array(
|
||||
'Main' => 'tests/'
|
||||
),
|
||||
));
|
||||
|
||||
$this->repository->expects($this->once())
|
||||
->method('getCanonicalPackages')
|
||||
->will($this->returnValue(array()));
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/composer');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/src/Main');
|
||||
file_put_contents($this->workingDir.'/src/Main/ClassMain.php', '<?php namespace Main; class ClassMain {}');
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/devfiles');
|
||||
file_put_contents($this->workingDir.'/devfiles/foo.php', '<?php function foo() { echo "foo"; }');
|
||||
|
||||
// generate autoload files with the dev mode set to true
|
||||
$this->generator->setDevMode(true);
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_1');
|
||||
|
||||
// check standard autoload
|
||||
$this->assertAutoloadFiles('main5', $this->vendorDir.'/composer');
|
||||
$this->assertAutoloadFiles('classmap7', $this->vendorDir.'/composer', 'classmap');
|
||||
|
||||
// make sure dev autoload is correctly dumped
|
||||
$this->assertAutoloadFiles('files2', $this->vendorDir.'/composer', 'files');
|
||||
}
|
||||
|
||||
public function testMainPackageDevAutoloadingDisabledByDefault()
|
||||
{
|
||||
$package = new Package('a', '1.0', '1.0');
|
||||
$package->setAutoload(array(
|
||||
'psr-0' => array(
|
||||
'Main' => 'src/',
|
||||
),
|
||||
));
|
||||
$package->setDevAutoload(array(
|
||||
'files' => array('devfiles/foo.php'),
|
||||
));
|
||||
|
||||
$this->repository->expects($this->once())
|
||||
->method('getCanonicalPackages')
|
||||
->will($this->returnValue(array()));
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/composer');
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/src/Main');
|
||||
file_put_contents($this->workingDir.'/src/Main/ClassMain.php', '<?php namespace Main; class ClassMain {}');
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->workingDir.'/devfiles');
|
||||
file_put_contents($this->workingDir.'/devfiles/foo.php', '<?php function foo() { echo "foo"; }');
|
||||
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_1');
|
||||
|
||||
// check standard autoload
|
||||
$this->assertAutoloadFiles('main4', $this->vendorDir.'/composer');
|
||||
$this->assertAutoloadFiles('classmap7', $this->vendorDir.'/composer', 'classmap');
|
||||
|
||||
// make sure dev autoload is disabled when dev mode is set to false
|
||||
$this->assertFalse(is_file($this->vendorDir.'/composer/autoload_files.php'));
|
||||
}
|
||||
|
||||
public function testVendorDirSameAsWorkingDir()
|
||||
{
|
||||
$this->vendorDir = $this->workingDir;
|
||||
|
@ -198,10 +323,6 @@ class AutoloadGeneratorTest extends TestCase
|
|||
$package = new Package('a', '1.0', '1.0');
|
||||
$package->setAutoload(array(
|
||||
'psr-0' => array('Main\\Foo' => '', 'Main\\Bar' => ''),
|
||||
'psr-4' => array(
|
||||
'Acme\Fruit\\' => 'src-fruit/',
|
||||
'Acme\Cake\\' => array('src-cake/', 'lib-cake/'),
|
||||
),
|
||||
'classmap' => array('Main/Foo/src', 'lib'),
|
||||
'files' => array('foo.php', 'Main/Foo/bar.php'),
|
||||
));
|
||||
|
@ -378,6 +499,48 @@ class AutoloadGeneratorTest extends TestCase
|
|||
include $this->vendorDir.'/composer/autoload_classmap.php'
|
||||
);
|
||||
$this->assertAutoloadFiles('classmap5', $this->vendorDir.'/composer', 'classmap');
|
||||
$this->assertNotContains('$loader->setClassMapAuthoritative(true);', file_get_contents($this->vendorDir.'/composer/autoload_real.php'));
|
||||
}
|
||||
|
||||
public function testClassMapAutoloadingAuthoritative()
|
||||
{
|
||||
$package = new Package('a', '1.0', '1.0');
|
||||
|
||||
$packages = array();
|
||||
$packages[] = $a = new Package('a/a', '1.0', '1.0');
|
||||
$packages[] = $b = new Package('b/b', '1.0', '1.0');
|
||||
$packages[] = $c = new Package('c/c', '1.0', '1.0');
|
||||
$a->setAutoload(array('classmap' => array('')));
|
||||
$b->setAutoload(array('classmap' => array('test.php')));
|
||||
$c->setAutoload(array('classmap' => array('./')));
|
||||
|
||||
$this->repository->expects($this->once())
|
||||
->method('getCanonicalPackages')
|
||||
->will($this->returnValue($packages));
|
||||
|
||||
$this->configValueMap['classmap-authoritative'] = true;
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/src');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/b/b');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/c/c/foo');
|
||||
file_put_contents($this->vendorDir.'/a/a/src/a.php', '<?php class ClassMapFoo {}');
|
||||
file_put_contents($this->vendorDir.'/b/b/test.php', '<?php class ClassMapBar {}');
|
||||
file_put_contents($this->vendorDir.'/c/c/foo/test.php', '<?php class ClassMapBaz {}');
|
||||
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, '_7');
|
||||
$this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated.");
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'ClassMapBar' => $this->vendorDir.'/b/b/test.php',
|
||||
'ClassMapBaz' => $this->vendorDir.'/c/c/foo/test.php',
|
||||
'ClassMapFoo' => $this->vendorDir.'/a/a/src/a.php',
|
||||
),
|
||||
include $this->vendorDir.'/composer/autoload_classmap.php'
|
||||
);
|
||||
$this->assertAutoloadFiles('classmap5', $this->vendorDir.'/composer', 'classmap');
|
||||
|
||||
$this->assertContains('$loader->setClassMapAuthoritative(true);', file_get_contents($this->vendorDir.'/composer/autoload_real.php'));
|
||||
}
|
||||
|
||||
public function testFilesAutoloadGeneration()
|
||||
|
@ -479,17 +642,31 @@ class AutoloadGeneratorTest extends TestCase
|
|||
$this->assertTrue(function_exists('testFilesAutoloadOrderByDependencyRoot'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that PSR-0 and PSR-4 mappings are processed in the correct order for
|
||||
* autoloading and for classmap generation:
|
||||
* - The main package has priority over other packages.
|
||||
* - Longer namespaces have priority over shorter namespaces.
|
||||
*/
|
||||
public function testOverrideVendorsAutoloading()
|
||||
{
|
||||
$package = new Package('z', '1.0', '1.0');
|
||||
$package->setAutoload(array('psr-0' => array('A\\B' => $this->workingDir.'/lib'), 'classmap' => array($this->workingDir.'/src')));
|
||||
$package->setRequires(array(new Link('z', 'a/a')));
|
||||
$mainPackage = new Package('z', '1.0', '1.0');
|
||||
$mainPackage->setAutoload(array(
|
||||
'psr-0' => array('A\\B' => $this->workingDir.'/lib'),
|
||||
'classmap' => array($this->workingDir.'/src')
|
||||
));
|
||||
$mainPackage->setRequires(array(new Link('z', 'a/a')));
|
||||
|
||||
$packages = array();
|
||||
$packages[] = $a = new Package('a/a', '1.0', '1.0');
|
||||
$packages[] = $b = new Package('b/b', '1.0', '1.0');
|
||||
$a->setAutoload(array('psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'), 'classmap' => array('classmap')));
|
||||
$b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/')));
|
||||
$a->setAutoload(array(
|
||||
'psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'),
|
||||
'classmap' => array('classmap'),
|
||||
));
|
||||
$b->setAutoload(array(
|
||||
'psr-0' => array('B\\Sub\\Name' => 'src/'),
|
||||
));
|
||||
|
||||
$this->repository->expects($this->once())
|
||||
->method('getCanonicalPackages')
|
||||
|
@ -502,8 +679,12 @@ class AutoloadGeneratorTest extends TestCase
|
|||
$this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/src');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/lib/A/B');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/b/b/src');
|
||||
|
||||
// Define the classes A\B\C and Foo\Bar in the main package.
|
||||
file_put_contents($this->workingDir.'/lib/A/B/C.php', '<?php namespace A\\B; class C {}');
|
||||
file_put_contents($this->workingDir.'/src/classes.php', '<?php namespace Foo; class Bar {}');
|
||||
|
||||
// Define the same two classes in the package a/a.
|
||||
file_put_contents($this->vendorDir.'/a/a/lib/A/B/C.php', '<?php namespace A\\B; class C {}');
|
||||
file_put_contents($this->vendorDir.'/a/a/classmap/classes.php', '<?php namespace Foo; class Bar {}');
|
||||
|
||||
|
@ -552,7 +733,7 @@ return array(
|
|||
|
||||
EOF;
|
||||
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_9');
|
||||
$this->generator->dump($this->config, $this->repository, $mainPackage, $this->im, 'composer', true, '_9');
|
||||
$this->assertEquals($expectedNamespace, file_get_contents($this->vendorDir.'/composer/autoload_namespaces.php'));
|
||||
$this->assertEquals($expectedPsr4, file_get_contents($this->vendorDir.'/composer/autoload_psr4.php'));
|
||||
$this->assertEquals($expectedClassmap, file_get_contents($this->vendorDir.'/composer/autoload_classmap.php'));
|
||||
|
@ -706,10 +887,7 @@ EOF;
|
|||
->method('getCanonicalPackages')
|
||||
->will($this->returnValue(array()));
|
||||
|
||||
$this->config->expects($this->at(2))
|
||||
->method('get')
|
||||
->with($this->equalTo('use-include-path'))
|
||||
->will($this->returnValue(true));
|
||||
$this->configValueMap['use-include-path'] = true;
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/a');
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue