Skip to content

Commit

Permalink
Merge pull request magento#1377 from magento-engcom/develop-prs
Browse files Browse the repository at this point in the history
Public Pull Requests

magento#8990
magento#10404
  • Loading branch information
Oleksii Korshenko authored Aug 2, 2017
2 parents da064df + 5131c5b commit 4c9194d
Show file tree
Hide file tree
Showing 4 changed files with 237 additions and 23 deletions.
63 changes: 41 additions & 22 deletions app/code/Magento/SampleData/Model/Dependency.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
*/
namespace Magento\SampleData\Model;

use Magento\Framework\App\ObjectManager;
use Magento\Framework\Component\ComponentRegistrar;
use Magento\Framework\Component\ComponentRegistrarInterface;
use Magento\Framework\Composer\ComposerInformation;
use Magento\Framework\Filesystem;
use Magento\Framework\Config\Composer\Package;
use Magento\Framework\Config\Composer\PackageFactory;
use Magento\Framework\Filesystem;
use Magento\Framework\Filesystem\Directory\ReadInterfaceFactory;

/**
* Sample Data dependency
Expand All @@ -26,43 +29,50 @@ class Dependency
*/
protected $composerInformation;

/**
* @var Filesystem
*/
private $filesystem;

/**
* @var PackageFactory
*/
private $packageFactory;

/**
* @var ComponentRegistrar
* @var ComponentRegistrarInterface
*/
private $componentRegistrar;

/**
* @var ReadInterfaceFactory
*/
private $directoryReadFactory;

/**
* Initialize dependencies.
*
* @param ComposerInformation $composerInformation
* @param Filesystem $filesystem
* @param Filesystem $filesystem @deprecated 2.3.0 $directoryReadFactory is used instead
* @param PackageFactory $packageFactory
* @param ComponentRegistrar $componentRegistrar
* @param ComponentRegistrarInterface $componentRegistrar
* @param Filesystem\Directory\ReadInterfaceFactory|null $directoryReadFactory
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function __construct(
ComposerInformation $composerInformation,
Filesystem $filesystem,
PackageFactory $packageFactory,
ComponentRegistrar $componentRegistrar
ComponentRegistrarInterface $componentRegistrar,
\Magento\Framework\Filesystem\Directory\ReadInterfaceFactory $directoryReadFactory = null
) {
$this->composerInformation = $composerInformation;
$this->filesystem = $filesystem;
$this->packageFactory = $packageFactory;
$this->componentRegistrar = $componentRegistrar;
$this->directoryReadFactory = $directoryReadFactory ?:
ObjectManager::getInstance()->get(ReadInterfaceFactory::class);
}

/**
* Retrieve list of sample data packages from suggests
*
* @return array
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function getSampleDataPackages()
{
Expand All @@ -81,19 +91,13 @@ public function getSampleDataPackages()
* Retrieve suggested sample data packages from modules composer.json
*
* @return array
* @throws \Magento\Framework\Exception\FileSystemException
*/
protected function getSuggestsFromModules()
{
$suggests = [];
foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $moduleDir) {
$file = $moduleDir . '/composer.json';

if (!file_exists($file) || !is_readable($file)) {
continue;
}

/** @var Package $package */
$package = $this->getModuleComposerPackage($file);
$package = $this->getModuleComposerPackage($moduleDir);
$suggest = json_decode(json_encode($package->get('suggest')), true);
if (!empty($suggest)) {
$suggests += $suggest;
Expand All @@ -105,11 +109,26 @@ protected function getSuggestsFromModules()
/**
* Load package
*
* @param string $file
* @param string $moduleDir
* @return Package
* @throws \Magento\Framework\Exception\FileSystemException
*/
protected function getModuleComposerPackage($file)
private function getModuleComposerPackage($moduleDir)
{
return $this->packageFactory->create(['json' => json_decode(file_get_contents($file))]);
/*
* Also look in parent directory of registered module directory to allow modules to follow the pds/skeleton
* standard and have their source code in a "src" subdirectory of the repository
*
* see: https://github.com/php-pds/skeleton
*/
foreach ([$moduleDir, $moduleDir . DIRECTORY_SEPARATOR . '..'] as $dir) {
/** @var Filesystem\Directory\ReadInterface $directory */
$directory = $this->directoryReadFactory->create(['path' => $dir]);
if ($directory->isExist('composer.json') && $directory->isReadable('composer.json')) {
/** @var Package $package */
return $this->packageFactory->create(['json' => json_decode($directory->readFile('composer.json'))]);
}
}
return $this->packageFactory->create(['json' => new \stdClass]);
}
}
189 changes: 189 additions & 0 deletions app/code/Magento/SampleData/Test/Unit/Model/DependencyTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\SampleData\Test\Unit\Model;

use Magento\Framework\Component\ComponentRegistrar;
use Magento\Framework\Component\ComponentRegistrarInterface;
use Magento\Framework\Composer\ComposerInformation;
use Magento\Framework\Config\Composer\Package;
use Magento\Framework\Config\Composer\PackageFactory;
use Magento\Framework\Exception\FileSystemException;
use Magento\Framework\Filesystem;
use Magento\Framework\Phrase;
use Magento\SampleData\Model\Dependency;

class DependencyTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider dataPackagesFromComposerSuggest
* @param string[] $moduleDirectories
* @param callable $composerJsonGenerator
* @param string[] $suggestionsFromLockFile
* @param string[] $expectedPackages
*/
public function testPackagesFromComposerSuggest(
array $moduleDirectories,
callable $composerJsonGenerator,
array $suggestionsFromLockFile,
array $expectedPackages
) {
/** @var ComposerInformation|\PHPUnit_Framework_MockObject_MockObject $composerInformation */
$composerInformation = $this->getMockBuilder(ComposerInformation::class)
->disableOriginalConstructor()
->getMock();
$composerInformation->method('getSuggestedPackages')
->willReturn($suggestionsFromLockFile);

/** @var Filesystem|\PHPUnit_Framework_MockObject_MockObject $filesystem */
$filesystem = $this->getMockBuilder(Filesystem::class)->disableOriginalConstructor()->getMock();

/** @var PackageFactory|\PHPUnit_Framework_MockObject_MockObject $packageFactory */
$packageFactory = $this->getMockBuilder(PackageFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
$packageFactory->method('create')
->willReturnCallback(function ($args) {
return new Package($args['json']);
});

/** @var ComponentRegistrarInterface|\PHPUnit_Framework_MockObject_MockObject $componentRegistrar */
$componentRegistrar = $this->getMockBuilder(ComponentRegistrarInterface::class)
->getMockForAbstractClass();
$componentRegistrar->method('getPaths')
->with(ComponentRegistrar::MODULE)
->willReturn(
$moduleDirectories
);

$directoryReadFactory = $this->getMockBuilder(Filesystem\Directory\ReadInterfaceFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
$directoryReadFactory->method('create')
->willReturnMap($composerJsonGenerator($this));

$dependency = new Dependency(
$composerInformation,
$filesystem,
$packageFactory,
$componentRegistrar,
$directoryReadFactory
);
$this->assertEquals($expectedPackages, $dependency->getSampleDataPackages());
}
public static function dataPackagesFromComposerSuggest()
{
return [
[
'moduleDirectories' => [
'app/code/LocalModule',
'app/code/LocalModuleWithoutComposerJson',
'vendor/company/module',
'vendor/company2/module/src'
],
'composerJsonGenerator' => function (DependencyTest $test) {
return [
[
['path' => 'app/code/LocalModule'],
$test->stubComposerJsonReader(
[
'name' => 'local/module',
'suggest' => [
'local/module-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '0.1.0'
]
]
)
],
[
['path' => 'app/code/LocalModuleWithoutComposerJson'],
$test->stubFileNotFoundReader()
],
[
['path' => 'vendor/company/module'],
$test->stubComposerJsonReader(
[
'name' => 'company/module',
'suggest' => [
'company/module-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '1.0.0-beta'
]
]
)
],
[
['path' => 'vendor/company2/module/src/..'],
$test->stubComposerJsonReader(
[
'name' => 'company2/module',
'suggest' => [
'company2/module-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '1.10'
]
]
)
],
[
['path' => 'vendor/company2/module/src'],
$test->stubFileNotFoundReader()
],
[
['path' => 'vendor/company/module/..'],
$test->stubFileNotFoundReader()
],
[
['path' => 'app/code/LocalModuleWithoutComposerJson/..'],
$test->stubFileNotFoundReader()
],
[
['path' => 'app/code/LocalModule/..'],
$test->stubFileNotFoundReader()
],
];
},
'suggestions' => [
'magento/foo-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '100.0.0',
'thirdparty/bar-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '1.2.3',
'thirdparty/something-else' => 'Just a suggested package',
],
'expectedPackages' => [
'magento/foo-sample-data' => '100.0.0',
'thirdparty/bar-sample-data' => '1.2.3',
'local/module-sample-data' => '0.1.0',
'company/module-sample-data' => '1.0.0-beta',
'company2/module-sample-data' => '1.10',
]
]
];
}

public function stubComposerJsonReader(array $composerJsonContent)
{
$stub = $this->getMockBuilder(Filesystem\Directory\ReadInterface::class)
->getMockForAbstractClass();
$stub->method('isExist')
->with('composer.json')
->willReturn(true);
$stub->method('isReadable')
->with('composer.json')
->willReturn(true);
$stub->method('readFile')
->with('composer.json')
->willReturn(json_encode($composerJsonContent));
return $stub;
}

public function stubFileNotFoundReader()
{
$stub = $this->getMockBuilder(Filesystem\Directory\ReadInterface::class)
->getMockForAbstractClass();
$stub->method('isExist')
->with('composer.json')
->willReturn(false);
$stub->method('readFile')
->with('composer.json')
->willThrowException(new FileSystemException(new Phrase('File not found')));
return $stub;
}
}
6 changes: 6 additions & 0 deletions app/code/Magento/SampleData/etc/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,10 @@
</argument>
</arguments>
</type>
<virtualType name="Magento\SampleData\Filesystem\Directory\Read" type="Magento\Framework\Filesystem\Directory\Read">
<arguments>
<argument name="driver" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
</arguments>
</virtualType>
<preference for="Magento\Framework\Filesystem\Directory\ReadInterface" type="Magento\SampleData\Filesystem\Directory\Read" />
</config>
2 changes: 1 addition & 1 deletion lib/web/css/source/lib/_buttons.less
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// _____________________________________________

//
// Button with solid or pictire background
// Button with solid or picture background
// ---------------------------------------------

.lib-button(
Expand Down

0 comments on commit 4c9194d

Please sign in to comment.