/**
  * 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;
 }
Ejemplo n.º 2
0
 /**
  * @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'));
 }
Ejemplo n.º 3
0
 /**
  * @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;
 }
Ejemplo n.º 4
0
 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;
 }
Ejemplo n.º 6
0
 /**
  * @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));
 }
Ejemplo n.º 7
0
 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));
 }