diff --git a/src/Composer/Package/AliasPackage.php b/src/Composer/Package/AliasPackage.php index 183f2c740..3ab9c944d 100644 --- a/src/Composer/Package/AliasPackage.php +++ b/src/Composer/Package/AliasPackage.php @@ -333,6 +333,14 @@ class AliasPackage extends BasePackage implements CompletePackageInterface { return $this->aliasOf->getArchiveExcludes(); } + public function isAbandoned() + { + return $this->aliasOf->isAbandoned(); + } + public function getReplacementPackage() + { + return $this->aliasOf->getReplacementPackage(); + } public function __toString() { return parent::__toString().' (alias of '.$this->aliasOf->getVersion().')'; diff --git a/src/Composer/Package/CompletePackage.php b/src/Composer/Package/CompletePackage.php index a884174af..af2e2bc42 100644 --- a/src/Composer/Package/CompletePackage.php +++ b/src/Composer/Package/CompletePackage.php @@ -27,6 +27,7 @@ class CompletePackage extends Package implements CompletePackageInterface protected $homepage; protected $scripts = array(); protected $support = array(); + protected $abandoned = false; /** * @param array $scripts @@ -169,4 +170,32 @@ class CompletePackage extends Package implements CompletePackageInterface { return $this->support; } + + /** + * @return boolean + */ + public function isAbandoned() + { + return (boolean) $this->abandoned; + } + + /** + * @param boolean|string $abandoned + */ + public function setAbandoned($abandoned) + { + $this->abandoned = $abandoned; + } + + /** + * If the package is abandoned and has a suggested replacement, this method returns it + * + * @return string|null + */ + public function getReplacementPackage() + { + return $this->abandoned ?: null; + } + + } diff --git a/src/Composer/Package/CompletePackageInterface.php b/src/Composer/Package/CompletePackageInterface.php index a341766d3..8263a6535 100644 --- a/src/Composer/Package/CompletePackageInterface.php +++ b/src/Composer/Package/CompletePackageInterface.php @@ -78,4 +78,18 @@ interface CompletePackageInterface extends PackageInterface * @return array */ public function getSupport(); + + /** + * Returns if the package is abandoned or not + * + * @return boolean + */ + public function isAbandoned(); + + /** + * If the package is abandoned and has a suggested replacement, this method returns it + * + * @return string + */ + public function getReplacementPackage(); } diff --git a/src/Composer/Package/Dumper/ArrayDumper.php b/src/Composer/Package/Dumper/ArrayDumper.php index 67318c04a..50b2eb610 100644 --- a/src/Composer/Package/Dumper/ArrayDumper.php +++ b/src/Composer/Package/Dumper/ArrayDumper.php @@ -97,7 +97,7 @@ class ArrayDumper 'homepage', 'keywords', 'repositories', - 'support', + 'support' ); $data = $this->dumpValues($package, $keys, $data); @@ -105,6 +105,8 @@ class ArrayDumper if (isset($data['keywords']) && is_array($data['keywords'])) { sort($data['keywords']); } + + $data['abandoned'] = $package->getReplacementPackage() ?: false; } if ($package instanceof RootPackageInterface) { diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 142b15c72..e548c87e7 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -195,6 +195,10 @@ class ArrayLoader implements LoaderInterface if (isset($config['support'])) { $package->setSupport($config['support']); } + + if (isset($config['abandoned'])) { + $package->setAbandoned($config['abandoned']); + } } if ($aliasNormalized = $this->getBranchAlias($config)) { diff --git a/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php b/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php index 5576e3d05..656ec96bc 100644 --- a/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php +++ b/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php @@ -45,7 +45,8 @@ class ArrayDumperTest extends \PHPUnit_Framework_TestCase array( 'name' => 'foo', 'version' => '1.0', - 'version_normalized' => '1.0.0.0' + 'version_normalized' => '1.0.0.0', + 'abandoned' => false ), $config ); @@ -62,12 +63,31 @@ class ArrayDumperTest extends \PHPUnit_Framework_TestCase $this->assertSame('dev', $config['minimum-stability']); } + public function testDumpAbandoned() + { + $this->packageExpects('getReplacementPackage', true); + + $config = $this->dumper->dump($this->package); + + $this->assertSame(true, $config['abandoned']); + } + + public function testDumpAbandonedReplacement() + { + $this->packageExpects('getReplacementPackage', 'foo/bar'); + + $config = $this->dumper->dump($this->package); + + $this->assertSame('foo/bar', $config['abandoned']); + } + /** * @dataProvider getKeys */ public function testKeys($key, $value, $method = null, $expectedValue = null) { $this->packageExpects('get'.ucfirst($method ?: $key), $value); + $this->packageExpects('isAbandoned', $value); $config = $this->dumper->dump($this->package); diff --git a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php index 04a537abd..6e4e2f5ee 100644 --- a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php @@ -117,7 +117,8 @@ class ArrayLoaderTest extends \PHPUnit_Framework_TestCase 'archive' => array( 'exclude' => array('/foo/bar', 'baz', '!/foo/bar/baz'), ), - 'transport-options' => array('ssl' => array('local_cert' => '/opt/certs/test.pem')) + 'transport-options' => array('ssl' => array('local_cert' => '/opt/certs/test.pem')), + 'abandoned' => 'foo/bar' ); $package = $this->loader->load($config); @@ -138,4 +139,28 @@ class ArrayLoaderTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf('Composer\Package\AliasPackage', $package); $this->assertEquals('1.0.x-dev', $package->getPrettyVersion()); } + + public function testAbandoned() + { + $config = array( + 'name' => 'A', + 'version' => '1.2.3.4', + 'abandoned' => 'foo/bar' + ); + + $package = $this->loader->load($config); + $this->assertTrue($package->isAbandoned()); + $this->assertEquals('foo/bar', $package->getReplacementPackage()); + } + + public function testNotAbandoned() + { + $config = array( + 'name' => 'A', + 'version' => '1.2.3.4' + ); + + $package = $this->loader->load($config); + $this->assertFalse($package->isAbandoned()); + } }