diff --git a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php index b84237bb2cd32233a96cabb23f16ebf6ea0d06b4..a8c360f6444fa331a317fd9995f419b013597c45 100644 --- a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php +++ b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php @@ -19,6 +19,8 @@ use Magento\Framework\Setup\BackupRollbackFactory; /** * Command for uninstalling language and backup-code feature + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class UninstallLanguageCommand extends Command { @@ -151,7 +153,7 @@ class UninstallLanguageCommand extends Command */ private function validate($package) { - $installedPackages = $this->composerInfo->getRootRequiredPackagesAndTypes(); + $installedPackages = $this->composerInfo->getRootRequiredPackageTypesByName(); if (isset($installedPackages[$package]) && $installedPackages[$package] === 'magento2-language') { return true; diff --git a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php index 2f0cd02c6c9ea0f0e58128c6a999c6d86136fdf7..9ccb47dd1e92b4ac454e2228e5b78844f8e130d1 100644 --- a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php +++ b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php @@ -93,7 +93,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -123,7 +123,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -148,7 +148,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -178,7 +178,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'library' diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php similarity index 83% rename from dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php rename to dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php index cdcf2ca0817ffc06a9d5fc2793344ca3b535dacf..1fa911de8e967300eddd85a7c73390d011ce4f82 100644 --- a/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php @@ -4,10 +4,10 @@ * See COPYING.txt for license details. */ -namespace Magento\Setup\Model; +namespace Magento\Framework\Composer; /** - * Tests Magento\Setup\Model\ComposerInformation + * Tests Magento\Framework\ComposerInformation */ class ComposerInformationTest extends \PHPUnit_Framework_TestCase { @@ -84,6 +84,22 @@ class ComposerInformationTest extends \PHPUnit_Framework_TestCase } } + /** + * @param $composerDir string Directory under _files that contains composer files + * + * @dataProvider getRequiredPhpVersionDataProvider + */ + public function testGetRootRequiredPackagesAndTypes($composerDir) + { + $this->setupDirectoryMock($composerDir); + $composerInfo = new ComposerInformation($this->filesystemMock, $this->ioMock); + + $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackageTypesByName(); + + $this->assertArrayHasKey('composer/composer', $requiredPackagesAndTypes); + $this->assertEquals('library', $requiredPackagesAndTypes['composer/composer']); + } + /** * Data provider that returns directories containing different types of composer files. * diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.lock similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.lock diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/vendor/README similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/vendor/README diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.lock similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.lock diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/vendor/README similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/vendor/README diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.json similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.json diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.lock similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.lock diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/vendor/README similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/vendor/README diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/vendor_path.php similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/vendor_path.php diff --git a/lib/internal/Magento/Framework/Composer/ComposerInformation.php b/lib/internal/Magento/Framework/Composer/ComposerInformation.php index 5ba195f386dba1d3e489993b423c00bde17aa295..852ef6aebef3fcfea1214a46b696715a1d58b52d 100644 --- a/lib/internal/Magento/Framework/Composer/ComposerInformation.php +++ b/lib/internal/Magento/Framework/Composer/ComposerInformation.php @@ -7,6 +7,8 @@ namespace Magento\Framework\Composer; use Composer\Factory as ComposerFactory; +use Composer\IO\BufferIO; +use Composer\Package\Link; use Composer\Package\PackageInterface; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; @@ -30,15 +32,28 @@ class ComposerInformation * Constructor * * @param Filesystem $filesystem + * @param BufferIO $io + * @throws \Exception */ public function __construct( - Filesystem $filesystem + Filesystem $filesystem, + BufferIO $io ) { - $vendor = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); - $vendorPath = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() . include $vendor; + // composer.json is in same directory as vendor + $vendorPath = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); + $vendorDir = require "{$vendorPath}"; + $composerJson = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() + . "/{$vendorDir}/../composer.json"; + + $composerJsonRealPath = realpath($composerJson); + if ($composerJsonRealPath === false) { + throw new \Exception('Composer file not found: ' . $composerJson); + } + + putenv('COMPOSER_HOME=' . $filesystem->getDirectoryRead(DirectoryList::COMPOSER_HOME)->getAbsolutePath()); + // Create Composer - $io = new \Composer\IO\BufferIO(); - $this->composer = ComposerFactory::create($io, $vendorPath . '/../composer.json'); + $this->composer = ComposerFactory::create($io, $composerJson); $this->locker = $this->composer->getLocker(); } @@ -55,12 +70,16 @@ class ComposerInformation $requiredPhpVersion = $allPlatformReqs['php']->getPrettyConstraint(); } else { $packages = $this->locker->getLockedRepository()->getPackages(); + /** @var PackageInterface $package */ foreach ($packages as $package) { - /** @var \Composer\Package\CompletePackage $package */ - $packageName = $package->getPrettyName(); - if ($packageName === 'magento/product-community-edition') { - $phpRequirementLink = $package->getRequires()['php']; - $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); + if ($package instanceof PackageInterface) { + $packageName = $package->getPrettyName(); + if ($packageName === 'magento/product-community-edition') { + $phpRequirementLink = $package->getRequires()['php']; + if ($phpRequirementLink instanceof Link) { + $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); + } + } } } } @@ -81,32 +100,23 @@ class ComposerInformation */ public function getRequiredExtensions() { - if ($this->isMagentoRoot()) { - $allPlatformReqs = $this->locker->getPlatformRequirements(true); - foreach ($allPlatformReqs as $reqIndex => $constraint) { - if (substr($reqIndex, 0, 4) === 'ext-') { - $requiredExtensions[] = substr($reqIndex, 4); - } - } - } else { - $requiredExtensions = []; + $requiredExtensions = []; + $allPlatformReqs = array_keys($this->locker->getPlatformRequirements(true)); + if (!$this->isMagentoRoot()) { /** @var \Composer\Package\CompletePackage $package */ foreach ($this->locker->getLockedRepository()->getPackages() as $package) { - $requires = $package->getRequires(); - $requires = array_merge($requires, $package->getDevRequires()); - foreach ($requires as $reqIndex => $constraint) { - if (substr($reqIndex, 0, 4) === 'ext-') { - $requiredExtensions[] = substr($reqIndex, 4); - } - } + $requires = array_keys($package->getRequires()); + $requires = array_merge($requires, array_keys($package->getDevRequires())); + $allPlatformReqs = array_merge($allPlatformReqs, $requires); } } - - if (!isset($requiredExtensions)) { - throw new \Exception('Cannot find extensions in \'composer.lock\' file'); + foreach ($allPlatformReqs as $reqIndex) { + if (substr($reqIndex, 0, 4) === 'ext-') { + $requiredExtensions[] = substr($reqIndex, 4); + } } - return $requiredExtensions; + return array_unique($requiredExtensions); } /** @@ -129,7 +139,7 @@ class ComposerInformation * * @return array */ - public function getRootRequiredPackagesAndTypes() + public function getRootRequiredPackageTypesByName() { $packages = []; /** @var PackageInterface $package */ @@ -147,6 +157,7 @@ class ComposerInformation private function isMagentoRoot() { $rootPackage = $this->composer->getPackage(); - return ('magento/magento2ce' == $rootPackage->getName()); + + return preg_match('/magento\/magento2.e/', $rootPackage->getName()); } } diff --git a/setup/src/Magento/Setup/Controller/Environment.php b/setup/src/Magento/Setup/Controller/Environment.php index e88ed5e59602a0485f5bbfc2bf42bbdc69404b8f..1be039847995bec34c7366efc63413b0876de890 100644 --- a/setup/src/Magento/Setup/Controller/Environment.php +++ b/setup/src/Magento/Setup/Controller/Environment.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Controller; use Composer\Package\Version\VersionParser; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\JsonModel; -use Magento\Setup\Model\ComposerInformation; +use Magento\Framework\Composer\ComposerInformation; use Magento\Setup\Model\PhpInformation; use Magento\Setup\Model\FilePermissions; diff --git a/setup/src/Magento/Setup/Model/ComposerInformation.php b/setup/src/Magento/Setup/Model/ComposerInformation.php deleted file mode 100644 index 431f4c8243f7b800ac9c07729c0d52d017e11de5..0000000000000000000000000000000000000000 --- a/setup/src/Magento/Setup/Model/ComposerInformation.php +++ /dev/null @@ -1,133 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Setup\Model; - -use Composer\Factory as ComposerFactory; -use Composer\IO\BufferIO; -use Composer\Package\Link; -use Composer\Package\PackageInterface; -use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Framework\Filesystem; - -/** - * Class ComposerInformation uses Composer to determine dependency information. - */ -class ComposerInformation -{ - /** - * @var \Composer\Composer - */ - private $composer; - - /** - * @var \Composer\Package\Locker - */ - private $locker; - - /** - * Constructor - * - * @param Filesystem $filesystem - * @param BufferIO $io - * @throws \Exception - */ - public function __construct( - Filesystem $filesystem, - BufferIO $io - ) { - // composer.json is in same directory as vendor - $vendorPath = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); - $vendorDir = require "{$vendorPath}"; - $composerJson = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() - . "/{$vendorDir}/../composer.json"; - - $composerJsonRealPath = realpath($composerJson); - if ($composerJsonRealPath === false) { - throw new \Exception('Composer file not found: ' . $composerJson); - } - - putenv('COMPOSER_HOME=' . $filesystem->getDirectoryRead(DirectoryList::COMPOSER_HOME)->getAbsolutePath()); - - // Create Composer - $this->composer = ComposerFactory::create($io, $composerJson); - $this->locker = $this->composer->getLocker(); - } - - /** - * Retrieves required php version - * - * @return string - * @throws \Exception If attributes are missing in composer.lock file. - */ - public function getRequiredPhpVersion() - { - if ($this->isMagentoRoot()) { - $allPlatformReqs = $this->locker->getPlatformRequirements(true); - $requiredPhpVersion = $allPlatformReqs['php']->getPrettyConstraint(); - } else { - $packages = $this->locker->getLockedRepository()->getPackages(); - /** @var PackageInterface $package */ - foreach ($packages as $package) { - if ($package instanceof PackageInterface) { - $packageName = $package->getPrettyName(); - if ($packageName === 'magento/product-community-edition') { - $phpRequirementLink = $package->getRequires()['php']; - if ($phpRequirementLink instanceof Link) { - $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); - } - } - } - } - } - - if (!isset($requiredPhpVersion)) { - throw new \Exception('Cannot find php version requirement in \'composer.lock\' file'); - } - return $requiredPhpVersion; - } - - /** - * Retrieve list of required extensions - * - * Collect required extensions from composer.lock file - * - * @return array - * @throws \Exception If attributes are missing in composer.lock file. - */ - public function getRequiredExtensions() - { - $requiredExtensions = []; - $allPlatformReqs = array_keys($this->locker->getPlatformRequirements(true)); - - if (!$this->isMagentoRoot()) { - /** @var \Composer\Package\CompletePackage $package */ - foreach ($this->locker->getLockedRepository()->getPackages() as $package) { - $requires = array_keys($package->getRequires()); - $requires = array_merge($requires, array_keys($package->getDevRequires())); - $allPlatformReqs = array_merge($allPlatformReqs, $requires); - } - } - foreach ($allPlatformReqs as $reqIndex) { - if (substr($reqIndex, 0, 4) === 'ext-') { - $requiredExtensions[] = substr($reqIndex, 4); - } - } - return array_unique($requiredExtensions); - } - - /** - * Determines if Magento is the root package or it is included as a requirement. - * - * @return bool - */ - private function isMagentoRoot() - { - $rootPackage = $this->composer->getPackage(); - - return preg_match('/magento\/magento2.e/', $rootPackage->getName()); - } -}