Skip to content

Commit f4d3015

Browse files
committed
Speedup bin/magento
1 parent ba5f8eb commit f4d3015

File tree

4 files changed

+53
-63
lines changed

4 files changed

+53
-63
lines changed

dev/tests/integration/testsuite/Magento/Setup/Model/ConfigOptionsListCollectorTest.php

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
*/
66
namespace Magento\Setup\Model;
77

8+
use Magento\Framework\Component\ComponentRegistrarInterface;
9+
use Magento\Setup\Validator\DbValidator;
10+
use Zend\ServiceManager\ServiceLocatorInterface;
11+
812
class ConfigOptionsListCollectorTest extends \PHPUnit\Framework\TestCase
913
{
1014
/**
@@ -14,7 +18,7 @@ class ConfigOptionsListCollectorTest extends \PHPUnit\Framework\TestCase
1418

1519
public function setUp()
1620
{
17-
$this->objectManagerProvider = $this->createMock(\Magento\Setup\Model\ObjectManagerProvider::class);
21+
$this->objectManagerProvider = $this->createMock(ObjectManagerProvider::class);
1822
$this->objectManagerProvider
1923
->expects($this->any())
2024
->method('get')
@@ -24,11 +28,13 @@ public function setUp()
2428
public function testCollectOptionsLists()
2529
{
2630
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
27-
$fullModuleListMock = $this->createMock(\Magento\Framework\Module\FullModuleList::class);
28-
$fullModuleListMock->expects($this->once())->method('getNames')->willReturn(['Magento_Backend']);
31+
$componentRegistrar = $this->createMock(ComponentRegistrarInterface::class);
32+
$componentRegistrar->expects($this->once())
33+
->method('getPaths')
34+
->willReturn(['Magento_Backend'=>'app/code/Magento/Backend']);
2935

30-
$dbValidator = $this->createMock(\Magento\Setup\Validator\DbValidator::class);
31-
$configGenerator = $this->createMock(\Magento\Setup\Model\ConfigGenerator::class);
36+
$dbValidator = $this->createMock(DbValidator::class);
37+
$configGenerator = $this->createMock(ConfigGenerator::class);
3238

3339
$setupOptions = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
3440
->create(
@@ -39,7 +45,7 @@ public function testCollectOptionsLists()
3945
]
4046
);
4147

42-
$serviceLocator = $this->getMockForAbstractClass(\Zend\ServiceManager\ServiceLocatorInterface::class);
48+
$serviceLocator = $this->getMockForAbstractClass(ServiceLocatorInterface::class);
4349

4450
$serviceLocator->expects($this->once())
4551
->method('get')
@@ -51,7 +57,7 @@ public function testCollectOptionsLists()
5157
\Magento\Setup\Model\ConfigOptionsListCollector::class,
5258
[
5359
'objectManagerProvider' => $this->objectManagerProvider,
54-
'fullModuleList' => $fullModuleListMock,
60+
'componentRegistrar' => $componentRegistrar,
5561
'serviceLocator' => $serviceLocator
5662
]
5763
);

lib/internal/Magento/Framework/Module/DependencyChecker.php

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,31 @@
1313
class DependencyChecker
1414
{
1515
/**
16-
* Enabled module list from configuration
17-
*
18-
* @var array
19-
*/
20-
private $enabledModuleList;
21-
22-
/**
23-
* The full module list information from filesystem
24-
*
25-
* @var array
16+
* @var PackageInfo
2617
*/
27-
private $fullModuleList;
18+
protected $packageInfo;
2819

2920
/**
30-
* Graph
31-
*
32-
* @var Graph
21+
* @var ModuleList
3322
*/
34-
private $graph;
35-
23+
private $list;
3624
/**
37-
* @var PackageInfo
25+
* @var ModuleList\Loader
3826
*/
39-
protected $packageInfo;
27+
private $loader;
4028

4129
/**
4230
* Constructor
4331
*
4432
* @param ModuleList $list
4533
* @param ModuleList\Loader $loader
46-
* @param PackageInfoFactory $packageInfoFactory
34+
* @param PackageInfo $packageInfo
4735
*/
48-
public function __construct(ModuleList $list, ModuleList\Loader $loader, PackageInfoFactory $packageInfoFactory)
36+
public function __construct(ModuleList $list, ModuleList\Loader $loader, PackageInfo $packageInfo)
4937
{
50-
$this->enabledModuleList = $list->getNames();
51-
$this->fullModuleList = $loader->load();
52-
$this->packageInfo = $packageInfoFactory->create();
38+
$this->list = $list;
39+
$this->loader = $loader;
40+
$this->packageInfo = $packageInfo;
5341
}
5442

5543
/**
@@ -61,7 +49,7 @@ public function __construct(ModuleList $list, ModuleList\Loader $loader, Package
6149
*/
6250
public function checkDependenciesWhenDisableModules($toBeDisabledModules, $currentlyEnabledModules = null)
6351
{
64-
$masterList = isset($currentlyEnabledModules) ? $currentlyEnabledModules : $this->enabledModuleList;
52+
$masterList = $currentlyEnabledModules ?? $this->list->getNames();
6553
// assume disable succeeds: currently enabled modules - to-be-disabled modules
6654
$enabledModules = array_diff($masterList, $toBeDisabledModules);
6755
return $this->checkDependencyGraph(false, $toBeDisabledModules, $enabledModules);
@@ -76,7 +64,7 @@ public function checkDependenciesWhenDisableModules($toBeDisabledModules, $curre
7664
*/
7765
public function checkDependenciesWhenEnableModules($toBeEnabledModules, $currentlyEnabledModules = null)
7866
{
79-
$masterList = isset($currentlyEnabledModules) ? $currentlyEnabledModules : $this->enabledModuleList;
67+
$masterList = $currentlyEnabledModules ?? $this->list->getNames();
8068
// assume enable succeeds: union of currently enabled modules and to-be-enabled modules
8169
$enabledModules = array_unique(array_merge($masterList, $toBeEnabledModules));
8270
return $this->checkDependencyGraph(true, $toBeEnabledModules, $enabledModules);
@@ -89,17 +77,19 @@ public function checkDependenciesWhenEnableModules($toBeEnabledModules, $current
8977
* @param string[] $moduleNames list of modules to be enabled/disabled
9078
* @param string[] $enabledModules list of enabled modules assuming enable/disable succeeds
9179
* @return array
80+
* @throws \Magento\Framework\Exception\LocalizedException
9281
*/
9382
private function checkDependencyGraph($isEnable, $moduleNames, $enabledModules)
9483
{
95-
$this->graph = $this->createGraph();
84+
$fullModuleList = $this->loader->load();
85+
$graph = $this->createGraph($fullModuleList);
9686
$dependenciesMissingAll = [];
9787
$graphMode = $isEnable ? Graph::DIRECTIONAL : Graph::INVERSE;
9888
foreach ($moduleNames as $moduleName) {
9989
$dependenciesMissing = [];
100-
$paths = $this->graph->findPathsToReachableNodes($moduleName, $graphMode);
90+
$paths = $graph->findPathsToReachableNodes($moduleName, $graphMode);
10191
$modules = array_merge(
102-
array_keys($this->fullModuleList),
92+
array_keys($fullModuleList),
10393
$this->packageInfo->getNonExistingDependencies()
10494
);
10595
foreach ($modules as $module) {
@@ -119,15 +109,16 @@ private function checkDependencyGraph($isEnable, $moduleNames, $enabledModules)
119109
/**
120110
* Create the dependency graph
121111
*
112+
* @param array $fullModuleList
122113
* @return Graph
123114
*/
124-
private function createGraph()
115+
private function createGraph($fullModuleList)
125116
{
126117
$nodes = [];
127118
$dependencies = [];
128119

129120
// build the graph data
130-
foreach (array_keys($this->fullModuleList) as $moduleName) {
121+
foreach (array_keys($fullModuleList) as $moduleName) {
131122
$nodes[] = $moduleName;
132123
foreach ($this->packageInfo->getRequire($moduleName) as $dependModuleName) {
133124
if ($dependModuleName) {

lib/internal/Magento/Framework/Module/Test/Unit/DependencyCheckerTest.php

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ class DependencyCheckerTest extends \PHPUnit\Framework\TestCase
1919
*/
2020
private $packageInfoMock;
2121

22-
/**
23-
* @var \Magento\Framework\Module\PackageInfoFactory|\PHPUnit_Framework_MockObject_MockObject
24-
*/
25-
private $packageInfoFactoryMock;
26-
2722
/**
2823
* @var \Magento\Framework\Module\ModuleList|\PHPUnit_Framework_MockObject_MockObject
2924
*/
@@ -49,10 +44,7 @@ protected function setUp()
4944
->method('getRequire')
5045
->will($this->returnValueMap($requireMap));
5146

52-
$this->packageInfoFactoryMock = $this->createMock(\Magento\Framework\Module\PackageInfoFactory::class);
53-
$this->packageInfoFactoryMock->expects($this->once())
54-
->method('create')
55-
->will($this->returnValue($this->packageInfoMock));
47+
5648

5749
$this->listMock = $this->createMock(\Magento\Framework\Module\ModuleList::class);
5850
$this->loaderMock = $this->createMock(\Magento\Framework\Module\ModuleList\Loader::class);
@@ -70,7 +62,7 @@ public function testCheckDependenciesWhenDisableModules()
7062
$this->packageInfoMock->expects($this->atLeastOnce())
7163
->method('getNonExistingDependencies')
7264
->willReturn([]);
73-
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock);
65+
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoMock);
7466

7567
$actual = $this->checker->checkDependenciesWhenDisableModules(['B', 'D']);
7668
$expected = ['B' => ['A' => ['A', 'B']], 'D' => ['A' => ['A', 'B', 'D']]];
@@ -82,7 +74,7 @@ public function testCheckDependenciesWhenDisableModulesWithCurEnabledModules()
8274
$this->packageInfoMock->expects($this->atLeastOnce())
8375
->method('getNonExistingDependencies')
8476
->willReturn([]);
85-
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock);
77+
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoMock);
8678

8779
$actual = $this->checker->checkDependenciesWhenDisableModules(['B', 'D'], ['C', 'D', 'E']);
8880
$expected = ['B' => [], 'D' => []];
@@ -97,7 +89,7 @@ public function testCheckDependenciesWhenEnableModules()
9789
$this->packageInfoMock->expects($this->atLeastOnce())
9890
->method('getNonExistingDependencies')
9991
->willReturn([]);
100-
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock);
92+
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoMock);
10193
$actual = $this->checker->checkDependenciesWhenEnableModules(['B', 'D']);
10294
$expected = [
10395
'B' => ['A' => ['B', 'D', 'A'], 'E' => ['B', 'E']],
@@ -111,7 +103,7 @@ public function testCheckDependenciesWhenEnableModulesWithCurEnabledModules()
111103
$this->packageInfoMock->expects($this->atLeastOnce())
112104
->method('getNonExistingDependencies')
113105
->willReturn([]);
114-
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock);
106+
$this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoMock);
115107
$actual = $this->checker->checkDependenciesWhenEnableModules(['B', 'D'], ['C']);
116108
$expected = [
117109
'B' => ['A' => ['B', 'D', 'A'], 'E' => ['B', 'E']],

setup/src/Magento/Setup/Model/ConfigOptionsListCollector.php

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
namespace Magento\Setup\Model;
77

88
use Magento\Framework\App\Filesystem\DirectoryList;
9+
use Magento\Framework\Component\ComponentRegistrar;
10+
use Magento\Framework\Component\ComponentRegistrarInterface;
911
use Magento\Framework\Filesystem;
10-
use Magento\Framework\Module\FullModuleList;
1112
use Magento\Framework\Setup\ConfigOptionsListInterface;
1213
use Zend\ServiceManager\ServiceLocatorInterface;
1314

@@ -30,13 +31,6 @@ class ConfigOptionsListCollector
3031
*/
3132
private $filesystem;
3233

33-
/**
34-
* Module list including enabled and disabled modules
35-
*
36-
* @var FullModuleList
37-
*/
38-
private $fullModuleList;
39-
4034
/**
4135
* Object manager provider
4236
*
@@ -51,27 +45,34 @@ class ConfigOptionsListCollector
5145
*/
5246
private $serviceLocator;
5347

48+
/**
49+
* Component list
50+
*
51+
* @var ComponentRegistrarInterface
52+
*/
53+
private $componentRegistrar;
54+
5455
/**
5556
* Constructor
5657
*
5758
* @param DirectoryList $directoryList
5859
* @param Filesystem $filesystem
59-
* @param FullModuleList $fullModuleList
60+
* @param ComponentRegistrarInterface $componentRegistrar
6061
* @param ObjectManagerProvider $objectManagerProvider
6162
* @param ServiceLocatorInterface $serviceLocator
6263
*/
6364
public function __construct(
6465
DirectoryList $directoryList,
6566
Filesystem $filesystem,
66-
FullModuleList $fullModuleList,
67+
ComponentRegistrarInterface $componentRegistrar,
6768
ObjectManagerProvider $objectManagerProvider,
6869
ServiceLocatorInterface $serviceLocator
6970
) {
7071
$this->directoryList = $directoryList;
7172
$this->filesystem = $filesystem;
72-
$this->fullModuleList = $fullModuleList;
7373
$this->objectManagerProvider = $objectManagerProvider;
7474
$this->serviceLocator = $serviceLocator;
75+
$this->componentRegistrar = $componentRegistrar;
7576
}
7677

7778
/**
@@ -84,8 +85,8 @@ public function collectOptionsLists()
8485
{
8586
$optionsList = [];
8687

87-
// go through modules
88-
foreach ($this->fullModuleList->getNames() as $moduleName) {
88+
$modulePaths = $this->componentRegistrar->getPaths(ComponentRegistrar::MODULE);
89+
foreach ($modulePaths as $moduleName => $modulePath) {
8990
$optionsClassName = str_replace('_', '\\', $moduleName) . '\Setup\ConfigOptionsList';
9091
if (class_exists($optionsClassName)) {
9192
$optionsClass = $this->objectManagerProvider->get()->create($optionsClassName);

0 commit comments

Comments
 (0)