Skip to content

Commit 4f2a1ed

Browse files
committed
MAGETWO-33262: Singletenant compiler doesn't resolves generated classes in generated classes dependencies (recursion)
- added repositories generation for singletenant compiler
1 parent 8f09664 commit 4f2a1ed

File tree

6 files changed

+207
-1
lines changed

6 files changed

+207
-1
lines changed

dev/tests/unit/testsuite/Magento/Tools/Di/App/CompilerTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ private function getPreferences()
116116
private function getOptions()
117117
{
118118
return [
119+
Task\OperationFactory::REPOSITORY_GENERATOR => [
120+
'path' => BP . '/' . 'app/code',
121+
'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/']
122+
],
119123
Task\OperationFactory::AREA => [
120124
BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation'
121125
],
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Tools\Di\App\Task;
8+
9+
use Magento\Tools\Di\App\Task\Operation\RepositoryGenerator;
10+
use Magento\Tools\Di\Code\Scanner;
11+
use Magento\Tools\Di\Code\Reader\ClassesScanner;
12+
13+
class RepositoryGeneratorTest extends \PHPUnit_Framework_TestCase
14+
{
15+
/**
16+
* @var Scanner\DirectoryScanner | \PHPUnit_Framework_MockObject_MockObject
17+
*/
18+
private $directoryScannerMock;
19+
/**
20+
* @var Scanner\RepositoryScanner | \PHPUnit_Framework_MockObject_MockObject
21+
*/
22+
private $repositoryScannerMock;
23+
24+
/**
25+
* @var ClassesScanner | \PHPUnit_Framework_MockObject_MockObject
26+
*/
27+
private $classesScannerMock;
28+
29+
protected function setUp()
30+
{
31+
$this->directoryScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Scanner\DirectoryScanner')
32+
->setMethods([])
33+
->disableOriginalConstructor()
34+
->getMock();
35+
$this->repositoryScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Scanner\RepositoryScanner')
36+
->setMethods([])
37+
->disableOriginalConstructor()
38+
->getMock();
39+
$this->classesScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Reader\ClassesScanner')
40+
->setMethods([])
41+
->disableOriginalConstructor()
42+
->getMock();
43+
}
44+
45+
/**
46+
* @dataProvider wrongDataDataProvider
47+
*/
48+
public function testDoOperationEmptyData($wrongData)
49+
{
50+
$model = new RepositoryGenerator(
51+
$this->directoryScannerMock,
52+
$this->classesScannerMock,
53+
$this->repositoryScannerMock,
54+
$wrongData
55+
);
56+
57+
$this->assertNull($model->doOperation());
58+
}
59+
60+
/**
61+
* @returns array
62+
*/
63+
public function wrongDataDataProvider()
64+
{
65+
return [
66+
[[]],
67+
[['filePatterns' => ['php' => '*.php']]],
68+
[['path' => 'path']]
69+
];
70+
}
71+
72+
public function testDoOperationEmptyRepositories()
73+
{
74+
$data = [
75+
'path' => 'path/to/app',
76+
'filePatterns' => ['di' => 'di.xml'],
77+
];
78+
$files = ['di' => []];
79+
$model = new RepositoryGenerator(
80+
$this->directoryScannerMock,
81+
$this->classesScannerMock,
82+
$this->repositoryScannerMock,
83+
$data
84+
);
85+
86+
$this->classesScannerMock->expects($this->once())
87+
->method('getList')
88+
->with($data['path']);
89+
$this->directoryScannerMock->expects($this->once())
90+
->method('scan')
91+
->with(
92+
$data['path'],
93+
$data['filePatterns']
94+
)->willReturn($files);
95+
$this->repositoryScannerMock->expects($this->once())
96+
->method('setUseAutoload')
97+
->with(false);
98+
$this->repositoryScannerMock->expects($this->once())
99+
->method('collectEntities')
100+
->with($files['di'])
101+
->willReturn([]);
102+
103+
$this->assertEmpty($model->doOperation());
104+
}
105+
}

dev/tools/Magento/Tools/Di/App/Compiler.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ public function launch()
6565
);
6666

6767
$operations = [
68+
Task\OperationFactory::REPOSITORY_GENERATOR => [
69+
'path' => BP . '/' . 'app/code',
70+
'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/']
71+
],
6872
Task\OperationFactory::AREA => [
6973
BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation'
7074
],
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Tools\Di\App\Task\Operation;
8+
9+
use Magento\Tools\Di\App\Task\OperationInterface;
10+
use Magento\Tools\Di\Code\Scanner;
11+
use Magento\Tools\Di\Code\Reader\ClassesScanner;
12+
13+
class RepositoryGenerator implements OperationInterface
14+
{
15+
/**
16+
* @var Scanner\DirectoryScanner
17+
*/
18+
private $directoryScanner;
19+
/**
20+
* @var Scanner\RepositoryScanner
21+
*/
22+
private $repositoryScanner;
23+
/**
24+
* @var array
25+
*/
26+
private $data;
27+
/**
28+
* @var ClassesScanner
29+
*/
30+
private $classesScanner;
31+
32+
/**
33+
* @param Scanner\DirectoryScanner $directoryScanner
34+
* @param ClassesScanner $classesScanner
35+
* @param Scanner\RepositoryScanner $repositoryScanner
36+
* @param array $data
37+
*/
38+
public function __construct(
39+
Scanner\DirectoryScanner $directoryScanner,
40+
ClassesScanner $classesScanner,
41+
Scanner\RepositoryScanner $repositoryScanner,
42+
$data = []
43+
) {
44+
$this->directoryScanner = $directoryScanner;
45+
$this->repositoryScanner = $repositoryScanner;
46+
$this->data = $data;
47+
$this->classesScanner = $classesScanner;
48+
}
49+
50+
/**
51+
* Processes operation task
52+
*
53+
* @return void
54+
*/
55+
public function doOperation()
56+
{
57+
if (array_diff(array_keys($this->data), ['filePatterns', 'path'])
58+
!== array_diff(['filePatterns', 'path'], array_keys($this->data))) {
59+
return;
60+
}
61+
62+
$this->classesScanner->getList($this->data['path']);
63+
64+
$files = $this->directoryScanner->scan($this->data['path'], $this->data['filePatterns']);
65+
$this->repositoryScanner->setUseAutoload(false);
66+
$repositories = $this->repositoryScanner->collectEntities($files['di']);
67+
foreach ($repositories as $entityName) {
68+
class_exists($entityName);
69+
}
70+
}
71+
}

dev/tools/Magento/Tools/Di/App/Task/OperationFactory.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ class OperationFactory
2727
*/
2828
const INTERCEPTION_CACHE = 'interception_cache';
2929

30+
/**
31+
* Repository generator
32+
*/
33+
const REPOSITORY_GENERATOR = 'repository_generator';
34+
3035
/**
3136
* Operations definitions
3237
*
@@ -36,6 +41,7 @@ class OperationFactory
3641
self::AREA => 'Magento\Tools\Di\App\Task\Operation\Area',
3742
self::INTERCEPTION => 'Magento\Tools\Di\App\Task\Operation\Interception',
3843
self::INTERCEPTION_CACHE => 'Magento\Tools\Di\App\Task\Operation\InterceptionCache',
44+
self::REPOSITORY_GENERATOR => 'Magento\Tools\Di\App\Task\Operation\RepositoryGenerator'
3945
];
4046

4147
/**
@@ -62,6 +68,7 @@ public function create($operationAlias, $arguments = null)
6268
OperationException::UNAVAILABLE_OPERATION
6369
);
6470
}
71+
6572
return $this->objectManager->create($this->operationsDefinitions[$operationAlias], ['data' => $arguments]);
6673
}
6774
}

dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
*/
1111
class RepositoryScanner implements ScannerInterface
1212
{
13+
/**
14+
* @var bool
15+
*/
16+
private $useAutoload = true;
17+
1318
/**
1419
* Get array of class names
1520
*
@@ -32,7 +37,7 @@ public function collectEntities(array $files)
3237
&& !is_null($replacementType)
3338
&& (substr($forType->nodeValue, -19) == 'RepositoryInterface')
3439
) {
35-
if (!class_exists($replacementType->nodeValue)) {
40+
if (!class_exists($replacementType->nodeValue, $this->useAutoload)) {
3641
$persistor = str_replace('\\Repository', 'InterfacePersistor', $replacementType->nodeValue);
3742
$factory = str_replace('\\Repository', 'InterfaceFactory', $replacementType->nodeValue);
3843
$dataBuilder = str_replace('\\Repository', 'DataBuilder', $replacementType->nodeValue);
@@ -49,4 +54,14 @@ public function collectEntities(array $files)
4954
}
5055
return $repositoryClassNames;
5156
}
57+
58+
/**
59+
* Sets autoload flag
60+
*
61+
* @param boolean $useAutoload
62+
*/
63+
public function setUseAutoload($useAutoload)
64+
{
65+
$this->useAutoload = $useAutoload;
66+
}
5267
}

0 commit comments

Comments
 (0)