/** * Load an *Extension or *ExtensionInterface class. If it does not exist, create a stub file and load it. * * @param string $className * @return void */ public function load($className) { if (!class_exists($className)) { if (!$this->isExtension($className) && !$this->isExtensionInterface($className)) { return false; } $resultFileName = $this->generatorIo->generateResultFileName($className); if (!$this->generatorIo->fileExists($resultFileName)) { $this->generatorIo->makeResultFileDirectory($className); $classNameParts = explode('\\', $className); /* Split the type name and namespace for the file's contents. */ $justTypeName = $classNameParts[count($classNameParts) - 1]; unset($classNameParts[count($classNameParts) - 1]); $namespace = implode('\\', $classNameParts); if ($this->isExtension($className)) { $content = "namespace {$namespace};\n\nclass {$justTypeName} implements " . "{$justTypeName}Interface\n{\n\n}"; } else { if ($this->isExtensionInterface($className)) { $content = "namespace {$namespace};\n\ninterface {$justTypeName} extends " . "\\Magento\\Framework\\Api\\ExtensionAttributesInterface \n{\n\n}"; } } $this->generatorIo->writeResultFile($resultFileName, $content); } include $resultFileName; } return false; }
/** * @dataProvider trueFalseDataProvider */ public function testGenerateClassWithExistName($fileExists) { $this->definedClassesMock->expects($this->any())->method('isClassLoadableFromDisc')->willReturn(true); $resultClassFileName = '/Magento/Path/To/Class.php'; $this->ioObjectMock->expects($this->once())->method('generateResultFileName')->willReturn($resultClassFileName); $this->ioObjectMock->expects($this->once())->method('fileExists')->willReturn($fileExists); $includeFileInvokeCount = $fileExists ? 1 : 0; $this->ioObjectMock->expects($this->exactly($includeFileInvokeCount))->method('includeFile'); $this->assertEquals(\Magento\Framework\Code\Generator::GENERATION_SKIP, $this->model->generateClass('Magento\\GeneratedClass\\Factory')); }
/** * @return bool */ protected function _validateData() { $sourceClassName = $this->_getSourceClassName(); $resultClassName = $this->_getResultClassName(); $resultFileName = $this->_ioObject->getResultFileName($resultClassName); // @todo the controller handling logic below must be removed when controllers become PSR-0 compliant $controllerSuffix = 'Controller'; $pathParts = explode('_', $sourceClassName); if (strrpos($sourceClassName, $controllerSuffix) === strlen($sourceClassName) - strlen($controllerSuffix) && isset($pathParts[2]) && !in_array($pathParts[2], array('Block', 'Helper', 'Model'))) { $controllerPath = preg_replace('/^([0-9A-Za-z]*)_([0-9A-Za-z]*)/', '\\1_\\2_controllers', $sourceClassName); $filePath = stream_resolve_include_path(str_replace('_', '/', $controllerPath) . '.php'); $isSourceClassValid = !empty($filePath); } else { $isSourceClassValid = $this->_autoloader->getFile($sourceClassName); } if (!$isSourceClassValid) { $this->_addError('Source class ' . $sourceClassName . ' doesn\'t exist.'); return false; } elseif ($this->_autoloader->getFile($resultClassName)) { $this->_addError('Result class ' . $resultClassName . ' already exists.'); return false; } elseif (!$this->_ioObject->makeGenerationDirectory()) { $this->_addError('Can\'t create directory ' . $this->_ioObject->getGenerationDirectory() . '.'); return false; } elseif (!$this->_ioObject->makeResultFileDirectory($resultClassName)) { $this->_addError('Can\'t create directory ' . $this->_ioObject->getResultFileDirectory($resultClassName) . '.'); return false; } elseif ($this->_ioObject->fileExists($resultFileName)) { $this->_addError('Result file ' . $resultFileName . ' already exists.'); return false; } return true; }
public function testGenerateClassInterceptorWithNamespace() { $interceptorClassName = self::CLASS_NAME_WITH_NAMESPACE . '\\Interceptor'; $result = false; $generatorResult = $this->_generator->generateClass($interceptorClassName); if (\Magento\Framework\Code\Generator::GENERATION_ERROR !== $generatorResult) { $result = true; } $this->assertTrue($result, 'Failed asserting that \'' . (string) $generatorResult . '\' equals \'success\'.'); if (\Magento\Framework\Code\Generator::GENERATION_SUCCESS == $generatorResult) { $content = $this->_clearDocBlock(file_get_contents($this->_ioObject->getResultFileName(self::CLASS_NAME_WITH_NAMESPACE . '\\Interceptor'))); $expectedContent = $this->_clearDocBlock(file_get_contents(__DIR__ . '/_expected/SourceClassWithNamespaceInterceptor.php.sample')); $this->assertEquals($expectedContent, $content); } }
/** * Perform validation surrounding source and result classes and entity type * * @param string $resultEntityType * @param string $sourceClassName * @param string $resultClass * @return string|bool */ protected function shouldSkipGeneration($resultEntityType, $sourceClassName, $resultClass) { if (!$resultEntityType || !$sourceClassName) { return self::GENERATION_ERROR; } else { if ($this->definedClasses->isClassLoadableFromDisc($resultClass)) { $generatedFileName = $this->_ioObject->generateResultFileName($resultClass); /** * Must handle two edge cases: a competing process has generated the class and written it to disc already, * or the class exists in committed code, despite matching pattern to be generated. */ if ($this->_ioObject->fileExists($generatedFileName) && !$this->definedClasses->isClassLoadableFromMemory($resultClass)) { $this->_ioObject->includeFile($generatedFileName); } return self::GENERATION_SKIP; } else { if (!isset($this->_generatedEntities[$resultEntityType])) { throw new \InvalidArgumentException('Unknown generation entity.'); } } } return false; }
/** * @dataProvider fileExistsDataProvider * @param $fileName * @param $exists */ public function testFileExists($fileName, $exists) { $this->_filesystemDriverMock->expects($this->once())->method('isExists')->with($this->equalTo($fileName))->will($this->returnValue($exists)); $this->assertSame($exists, $this->_object->fileExists($fileName)); }
public function testFileExists() { $this->_filesystemDriverMock->expects($this->once())->method('isExists')->with($this->equalTo(self::FILE_NAME))->will($this->returnValue(false)); $this->assertFalse($this->_object->fileExists(self::FILE_NAME)); }