diff --git a/dev/tests/unit/testsuite/Magento/Tools/Di/App/CompilerTest.php b/dev/tests/unit/testsuite/Magento/Tools/Di/App/CompilerTest.php index 08f65859539f9..af3b695cc615d 100644 --- a/dev/tests/unit/testsuite/Magento/Tools/Di/App/CompilerTest.php +++ b/dev/tests/unit/testsuite/Magento/Tools/Di/App/CompilerTest.php @@ -116,6 +116,10 @@ private function getPreferences() private function getOptions() { return [ + Task\OperationFactory::REPOSITORY_GENERATOR => [ + 'path' => BP . '/' . 'app/code', + 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'] + ], Task\OperationFactory::AREA => [ BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' ], diff --git a/dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php b/dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php new file mode 100644 index 0000000000000..af8de6a7ca6db --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php @@ -0,0 +1,106 @@ +directoryScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Scanner\DirectoryScanner') + ->setMethods([]) + ->disableOriginalConstructor() + ->getMock(); + $this->repositoryScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Scanner\RepositoryScanner') + ->setMethods([]) + ->disableOriginalConstructor() + ->getMock(); + $this->classesScannerMock = $this->getMockBuilder('Magento\Tools\Di\Code\Reader\ClassesScanner') + ->setMethods([]) + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * @dataProvider wrongDataDataProvider + */ + public function testDoOperationEmptyData($wrongData) + { + $model = new RepositoryGenerator( + $this->directoryScannerMock, + $this->classesScannerMock, + $this->repositoryScannerMock, + $wrongData + ); + + $this->assertNull($model->doOperation()); + } + + /** + * @return array + */ + public function wrongDataDataProvider() + { + return [ + [[]], + [['filePatterns' => ['php' => '*.php']]], + [['path' => 'path']] + ]; + } + + public function testDoOperationEmptyRepositories() + { + $data = [ + 'path' => 'path/to/app', + 'filePatterns' => ['di' => 'di.xml'], + ]; + $files = ['di' => []]; + $model = new RepositoryGenerator( + $this->directoryScannerMock, + $this->classesScannerMock, + $this->repositoryScannerMock, + $data + ); + + $this->classesScannerMock->expects($this->once()) + ->method('getList') + ->with($data['path']); + $this->directoryScannerMock->expects($this->once()) + ->method('scan') + ->with( + $data['path'], + $data['filePatterns'] + )->willReturn($files); + $this->repositoryScannerMock->expects($this->once()) + ->method('setUseAutoload') + ->with(false); + $this->repositoryScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files['di']) + ->willReturn([]); + + $this->assertEmpty($model->doOperation()); + } +} diff --git a/dev/tools/Magento/Tools/Di/App/Compiler.php b/dev/tools/Magento/Tools/Di/App/Compiler.php index f57b1ae9cbb77..47ca458c42b69 100644 --- a/dev/tools/Magento/Tools/Di/App/Compiler.php +++ b/dev/tools/Magento/Tools/Di/App/Compiler.php @@ -65,6 +65,10 @@ public function launch() ); $operations = [ + Task\OperationFactory::REPOSITORY_GENERATOR => [ + 'path' => BP . '/' . 'app/code', + 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'] + ], Task\OperationFactory::AREA => [ BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' ], diff --git a/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php b/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php new file mode 100644 index 0000000000000..20d25b65dfad8 --- /dev/null +++ b/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php @@ -0,0 +1,74 @@ +directoryScanner = $directoryScanner; + $this->repositoryScanner = $repositoryScanner; + $this->data = $data; + $this->classesScanner = $classesScanner; + } + + /** + * Processes operation task + * + * @return void + */ + public function doOperation() + { + if (array_diff(array_keys($this->data), ['filePatterns', 'path']) + !== array_diff(['filePatterns', 'path'], array_keys($this->data))) { + return; + } + + $this->classesScanner->getList($this->data['path']); + + $files = $this->directoryScanner->scan($this->data['path'], $this->data['filePatterns']); + $this->repositoryScanner->setUseAutoload(false); + $repositories = $this->repositoryScanner->collectEntities($files['di']); + foreach ($repositories as $entityName) { + class_exists($entityName); + } + } +} diff --git a/dev/tools/Magento/Tools/Di/App/Task/OperationFactory.php b/dev/tools/Magento/Tools/Di/App/Task/OperationFactory.php index 9f810a282048c..f66328ea80e6c 100644 --- a/dev/tools/Magento/Tools/Di/App/Task/OperationFactory.php +++ b/dev/tools/Magento/Tools/Di/App/Task/OperationFactory.php @@ -27,6 +27,11 @@ class OperationFactory */ const INTERCEPTION_CACHE = 'interception_cache'; + /** + * Repository generator + */ + const REPOSITORY_GENERATOR = 'repository_generator'; + /** * Operations definitions * @@ -36,6 +41,7 @@ class OperationFactory self::AREA => 'Magento\Tools\Di\App\Task\Operation\Area', self::INTERCEPTION => 'Magento\Tools\Di\App\Task\Operation\Interception', self::INTERCEPTION_CACHE => 'Magento\Tools\Di\App\Task\Operation\InterceptionCache', + self::REPOSITORY_GENERATOR => 'Magento\Tools\Di\App\Task\Operation\RepositoryGenerator' ]; /** @@ -62,6 +68,7 @@ public function create($operationAlias, $arguments = null) OperationException::UNAVAILABLE_OPERATION ); } + return $this->objectManager->create($this->operationsDefinitions[$operationAlias], ['data' => $arguments]); } } diff --git a/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php b/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php index 02c7eba33062a..9eb25fc1c5004 100644 --- a/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php +++ b/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php @@ -10,6 +10,11 @@ */ class RepositoryScanner implements ScannerInterface { + /** + * @var bool + */ + private $useAutoload = true; + /** * Get array of class names * @@ -32,7 +37,7 @@ public function collectEntities(array $files) && !is_null($replacementType) && (substr($forType->nodeValue, -19) == 'RepositoryInterface') ) { - if (!class_exists($replacementType->nodeValue)) { + if (!class_exists($replacementType->nodeValue, $this->useAutoload)) { $persistor = str_replace('\\Repository', 'InterfacePersistor', $replacementType->nodeValue); $factory = str_replace('\\Repository', 'InterfaceFactory', $replacementType->nodeValue); $dataBuilder = str_replace('\\Repository', 'DataBuilder', $replacementType->nodeValue); @@ -49,4 +54,15 @@ public function collectEntities(array $files) } return $repositoryClassNames; } + + /** + * Sets autoload flag + * + * @param boolean $useAutoload + * @return void + */ + public function setUseAutoload($useAutoload) + { + $this->useAutoload = $useAutoload; + } }