From 4f2a1ed2ff92ec1561fd9cbc40fac1e03f697df9 Mon Sep 17 00:00:00 2001 From: Dmytro Kvashnin Date: Wed, 28 Jan 2015 18:06:29 +0200 Subject: [PATCH 1/2] MAGETWO-33262: Singletenant compiler doesn't resolves generated classes in generated classes dependencies (recursion) - added repositories generation for singletenant compiler --- .../Magento/Tools/Di/App/CompilerTest.php | 4 + .../Di/App/Task/RepositoryGeneratorTest.php | 105 ++++++++++++++++++ dev/tools/Magento/Tools/Di/App/Compiler.php | 4 + .../Task/Operation/RepositoryGenerator.php | 71 ++++++++++++ .../Tools/Di/App/Task/OperationFactory.php | 7 ++ .../Di/Code/Scanner/RepositoryScanner.php | 17 ++- 6 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php create mode 100644 dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php 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..dd698b6824ca2 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php @@ -0,0 +1,105 @@ +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()); + } + + /** + * @returns 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..4cc6902ce6d2b --- /dev/null +++ b/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php @@ -0,0 +1,71 @@ +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..f7551779a1bb5 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,14 @@ public function collectEntities(array $files) } return $repositoryClassNames; } + + /** + * Sets autoload flag + * + * @param boolean $useAutoload + */ + public function setUseAutoload($useAutoload) + { + $this->useAutoload = $useAutoload; + } } From 31305f2d0ad8db8323b4d6db8813e5c16279a07e Mon Sep 17 00:00:00 2001 From: Dmytro Kvashnin Date: Wed, 28 Jan 2015 18:13:53 +0200 Subject: [PATCH 2/2] MAGETWO-33262: Singletenant compiler doesn't resolves generated classes in generated classes dependencies (recursion) - fixed codestyle --- .../Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php | 3 ++- .../Tools/Di/App/Task/Operation/RepositoryGenerator.php | 3 +++ dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) 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 index dd698b6824ca2..af8de6a7ca6db 100644 --- a/dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php +++ b/dev/tests/unit/testsuite/Magento/Tools/Di/App/Task/RepositoryGeneratorTest.php @@ -16,6 +16,7 @@ class RepositoryGeneratorTest extends \PHPUnit_Framework_TestCase * @var Scanner\DirectoryScanner | \PHPUnit_Framework_MockObject_MockObject */ private $directoryScannerMock; + /** * @var Scanner\RepositoryScanner | \PHPUnit_Framework_MockObject_MockObject */ @@ -58,7 +59,7 @@ public function testDoOperationEmptyData($wrongData) } /** - * @returns array + * @return array */ public function wrongDataDataProvider() { diff --git a/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php b/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php index 4cc6902ce6d2b..20d25b65dfad8 100644 --- a/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php +++ b/dev/tools/Magento/Tools/Di/App/Task/Operation/RepositoryGenerator.php @@ -16,14 +16,17 @@ class RepositoryGenerator implements OperationInterface * @var Scanner\DirectoryScanner */ private $directoryScanner; + /** * @var Scanner\RepositoryScanner */ private $repositoryScanner; + /** * @var array */ private $data; + /** * @var ClassesScanner */ diff --git a/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php b/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php index f7551779a1bb5..9eb25fc1c5004 100644 --- a/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php +++ b/dev/tools/Magento/Tools/Di/Code/Scanner/RepositoryScanner.php @@ -59,6 +59,7 @@ public function collectEntities(array $files) * Sets autoload flag * * @param boolean $useAutoload + * @return void */ public function setUseAutoload($useAutoload) {