Skip to content

Commit f52e5db

Browse files
committed
Merge pull request #69 from magento-mpi/MAGETWO-33262
MAGETWO-33262: Singletenant compiler doesn't resolve Repositories
2 parents 413a60a + f3142ee commit f52e5db

File tree

6 files changed

+212
-1
lines changed

6 files changed

+212
-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: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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+
/**
21+
* @var Scanner\RepositoryScanner | \PHPUnit_Framework_MockObject_MockObject
22+
*/
23+
private $repositoryScannerMock;
24+
25+
/**
26+
* @var ClassesScanner | \PHPUnit_Framework_MockObject_MockObject
27+
*/
28+
private $classesScannerMock;
29+
30+
protected function setUp()
31+
{
32+
$this->directoryScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Scanner\DirectoryScanner')
33+
->setMethods([])
34+
->disableOriginalConstructor()
35+
->getMock();
36+
$this->repositoryScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Scanner\RepositoryScanner')
37+
->setMethods([])
38+
->disableOriginalConstructor()
39+
->getMock();
40+
$this->classesScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Reader\ClassesScanner')
41+
->setMethods([])
42+
->disableOriginalConstructor()
43+
->getMock();
44+
}
45+
46+
/**
47+
* @dataProvider wrongDataDataProvider
48+
*/
49+
public function testDoOperationEmptyData($wrongData)
50+
{
51+
$model = new RepositoryGenerator(
52+
$this->directoryScannerMock,
53+
$this->classesScannerMock,
54+
$this->repositoryScannerMock,
55+
$wrongData
56+
);
57+
58+
$this->assertNull($model->doOperation());
59+
}
60+
61+
/**
62+
* @return array
63+
*/
64+
public function wrongDataDataProvider()
65+
{
66+
return [
67+
[[]],
68+
[['filePatterns' => ['php' => '*.php']]],
69+
[['path' => 'path']]
70+
];
71+
}
72+
73+
public function testDoOperationEmptyRepositories()
74+
{
75+
$data = [
76+
'path' => 'path/to/app',
77+
'filePatterns' => ['di' => 'di.xml'],
78+
];
79+
$files = ['di' => []];
80+
$model = new RepositoryGenerator(
81+
$this->directoryScannerMock,
82+
$this->classesScannerMock,
83+
$this->repositoryScannerMock,
84+
$data
85+
);
86+
87+
$this->classesScannerMock->expects($this->once())
88+
->method('getList')
89+
->with($data['path']);
90+
$this->directoryScannerMock->expects($this->once())
91+
->method('scan')
92+
->with(
93+
$data['path'],
94+
$data['filePatterns']
95+
)->willReturn($files);
96+
$this->repositoryScannerMock->expects($this->once())
97+
->method('setUseAutoload')
98+
->with(false);
99+
$this->repositoryScannerMock->expects($this->once())
100+
->method('collectEntities')
101+
->with($files['di'])
102+
->willReturn([]);
103+
104+
$this->assertEmpty($model->doOperation());
105+
}
106+
}

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: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
/**
21+
* @var Scanner\RepositoryScanner
22+
*/
23+
private $repositoryScanner;
24+
25+
/**
26+
* @var array
27+
*/
28+
private $data;
29+
30+
/**
31+
* @var ClassesScanner
32+
*/
33+
private $classesScanner;
34+
35+
/**
36+
* @param Scanner\DirectoryScanner $directoryScanner
37+
* @param ClassesScanner $classesScanner
38+
* @param Scanner\RepositoryScanner $repositoryScanner
39+
* @param array $data
40+
*/
41+
public function __construct(
42+
Scanner\DirectoryScanner $directoryScanner,
43+
ClassesScanner $classesScanner,
44+
Scanner\RepositoryScanner $repositoryScanner,
45+
$data = []
46+
) {
47+
$this->directoryScanner = $directoryScanner;
48+
$this->repositoryScanner = $repositoryScanner;
49+
$this->data = $data;
50+
$this->classesScanner = $classesScanner;
51+
}
52+
53+
/**
54+
* Processes operation task
55+
*
56+
* @return void
57+
*/
58+
public function doOperation()
59+
{
60+
if (array_diff(array_keys($this->data), ['filePatterns', 'path'])
61+
!== array_diff(['filePatterns', 'path'], array_keys($this->data))) {
62+
return;
63+
}
64+
65+
$this->classesScanner->getList($this->data['path']);
66+
67+
$files = $this->directoryScanner->scan($this->data['path'], $this->data['filePatterns']);
68+
$this->repositoryScanner->setUseAutoload(false);
69+
$repositories = $this->repositoryScanner->collectEntities($files['di']);
70+
foreach ($repositories as $entityName) {
71+
class_exists($entityName);
72+
}
73+
}
74+
}

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: 17 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,15 @@ public function collectEntities(array $files)
4954
}
5055
return $repositoryClassNames;
5156
}
57+
58+
/**
59+
* Sets autoload flag
60+
*
61+
* @param boolean $useAutoload
62+
* @return void
63+
*/
64+
public function setUseAutoload($useAutoload)
65+
{
66+
$this->useAutoload = $useAutoload;
67+
}
5268
}

0 commit comments

Comments
 (0)