function it_inserts_properties(File $file, Property $property, InsertPropertyHandler $insertPropertyHandler)
 {
     $properties = [$property->getWrappedObject()];
     $insertProperties = new InsertProperties($file->getWrappedObject(), $properties);
     $insertProperty = Argument::Type(InsertProperty::class);
     $insertPropertyHandler->handle($insertProperty)->shouldBeCalled();
     $this->handle($insertProperties);
 }
 public function generate()
 {
     $repository = File::make($this->filename)->setLicensePhpdoc(new LicensePhpdoc(self::PROJECT_NAME, self::AUTHOR_NAME, self::AUTHOR_EMAIL))->addFullyQualifiedName(new FullyQualifiedName(BaseValidator::class))->addFullyQualifiedName(new FullyQualifiedName($this->appNamespace . "Entities\\" . $this->entity . "Entity as Entity"))->setStructure(Object::make($this->namespace . $this->entity . $this->layer)->extend(new Object(BaseValidator::class))->addProperty(Property::make('rules')->makeProtected()->setDefaultValue("[\n      'name' => 'required'\n    ]"))->addMethod(Method::make('__construct')->addArgument(new Argument('Entity', 'Entity'))->setBody('        parent::__construct($Entity);'))->addMethod(Method::make('getCreateRules')->setBody('        return parent::getCreateRules();'))->addMethod(Method::make('getUpdateRules')->setBody('        return parent::getUpdateRules();')));
     $prettyPrinter = Build::prettyPrinter();
     $generatedCode = $prettyPrinter->generateCode($repository);
     return $this->generateFile($generatedCode);
 }
 public function generate()
 {
     $entity = File::make($this->filename)->setLicensePhpdoc(new LicensePhpdoc(self::PROJECT_NAME, self::AUTHOR_NAME, self::AUTHOR_EMAIL))->addFullyQualifiedName(new FullyQualifiedName(\Illuminate\Database\Eloquent\Collection::class))->addFullyQualifiedName(new FullyQualifiedName(BaseEntity::class))->setStructure(Object::make($this->namespace . $this->entity . $this->layer)->extend(new Object(BaseEntity::class))->addProperty(Property::make('table')->makeProtected()->setDefaultValue("'" . $this->table . "'"))->addProperty(Property::make('fillable')->makeProtected()->setDefaultValue("['id' , 'name']"))->addProperty(Property::make('hidden')->makeProtected()->setDefaultValue("[]"))->addProperty(Property::make('appends')->makeProtected()->setDefaultValue("[]")));
     $prettyPrinter = Build::prettyPrinter();
     $generatedCode = $prettyPrinter->generateCode($entity);
     return $this->generateFile($generatedCode);
 }
 public function sample()
 {
     $file = File::make('Memio.php')->setStructure(Object::make('name\\space\\Sample')->addProperty(Property::make('string')->makePublic()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(VariableTag::make('string String'))))->addMethod(Method::make('get')->setPhpdoc(MethodPhpdoc::make()->setDescription(Description::make('Return string'))->setReturnTag(ReturnTag::make('string')))->setBody('return $this->string;'))->addMethod(Method::make('set')->setPhpdoc(MethodPhpdoc::make()->setDescription(Description::make('Set string'))->addParameterTag(ParameterTag::make('string', 'string', 'String'))->setReturnTag(ReturnTag::make('$this')))->addArgument(Argument::make('string', 'string'))->setBody('$this->string = $string;' . PHP_EOL . 'return $this;')));
     // Generate the code and display in the console
     $prettyPrinter = Build::prettyPrinter();
     $generatedCode = $prettyPrinter->generateCode($file);
     file_put_contents('tmp/origin/Memio.php', (string) $generatedCode);
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $file = $input->getArgument('file');
     $entity = $input->getArgument('entity');
     $entityDir = $input->getArgument('entity-dir');
     if (!file_exists($file)) {
         throw new \InvalidArgumentException("{$file} does not exist");
     }
     if (!is_dir($entityDir)) {
         throw new \InvalidArgumentException("{$entityDir} is not a valid directory");
     }
     $item = json_decode(file_get_contents($file))[0];
     $file = File::make($entityDir . '/' . $entity . '.php');
     $object = Object::make('Dandomain\\Api\\Entity\\' . $entity);
     $arrayProperties = [];
     foreach ($item as $key => $val) {
         if (gettype($val) == 'array') {
             $arrayProperties[] = $key;
         }
     }
     if (count($arrayProperties)) {
         $body = [];
         foreach ($arrayProperties as $arrayProperty) {
             $body[] = '        $this->' . $arrayProperty . ' = new ArrayCollection();';
         }
         $object->addMethod(Method::make('__construct')->setBody(join("\n", $body)));
         $file->addFullyQualifiedName(new FullyQualifiedName('Doctrine\\Common\\Collections\\ArrayCollection'));
     }
     foreach ($item as $key => $val) {
         $type = gettype($val);
         if ($type == 'array') {
             $type = 'ArrayCollection';
         }
         $property = Property::make($key)->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($type)));
         $object->addProperty($property);
         $object->addMethod(Method::make('get' . ucfirst($key))->setPhpdoc(MethodPhpdoc::make()->setReturnTag(new ReturnTag($type)))->setBody('        return $this->' . $key . ';'));
         $object->addMethod(Method::make('set' . ucfirst($key))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($type, $key))->setReturnTag(new ReturnTag($entity)))->addArgument(Argument::make('string', $key))->setBody('        $this->' . $key . ' = $' . $key . ';'));
     }
     $file->setStructure($object);
     $prettyPrinter = Build::prettyPrinter();
     $generatedCode = $prettyPrinter->generateCode($file);
     file_put_contents($file->getFilename(), $generatedCode);
 }
    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $model = $input->getArgument('model');
        $outputFile = sprintf('%s.php', $this->joinPaths($input->getOption('output'), str_replace('\\', DIRECTORY_SEPARATOR, $model)));
        $classObject = Object::make($model);
        $file = File::make($outputFile)->setStructure($classObject);
        $file->addFullyQualifiedName(FullyQualifiedName::make('Doctrine\\ODM\\MongoDB\\Mapping\\Annotations as ODM'));
        $file->addFullyQualifiedName(FullyQualifiedName::make('Hive\\Annotations as H'));
        $fields = array_merge(['id:id'], $input->getArgument('fields'));
        foreach ($fields as $field) {
            if (!preg_match('/(\\w+)(?::(string|boolean|id|reference[s]?)(?:\\[([\\w\\\\]+),(\\w+)\\])?)?(?::(\\w+))?/i', $field, $matches)) {
                continue;
            }
            @(list($all, $name, $type, $referenceType, $linkProperty, $fake) = $matches);
            /** @var Property $property */
            $property = Property::make($name);
            $property->makePublic();
            $property->setPhpdoc(new ODMPropertyPhpdoc($name, $type, $referenceType, $linkProperty, $fake));
            $classObject->addProperty($property);
        }
        $classObject->setPhpdoc(StructurePhpdoc::make()->setDescription(Description::make(<<<'EOF'
This class is generated with the hive console.

@ODM\Document @ODM\HasLifecycleCallbacks
EOF
)));
        $classObject->addMethod(Method::make('validate')->setPhpdoc(MethodPhpdoc::make()->setDescription(Description::make(<<<'EOF'
The validate method can be used to validate properties.

@ODM\PrePersist @ODM\PreUpdate
EOF
))));
        // Generate the code
        $prettyPrinter = Build::prettyPrinter();
        $prettyPrinter->addTemplatePath(realpath($this->joinPaths(dirname(__FILE__), '../../../templates/memio/')));
        $generatedCode = $prettyPrinter->generateCode($file);
        @mkdir(dirname($outputFile), 0755, true);
        file_put_contents($outputFile, html_entity_decode(html_entity_decode($generatedCode)));
        $io = new SymfonyStyle($input, $output);
        $io->success(["Model {$model} created in {$outputFile}"]);
    }
Example #7
0
    protected function generateCodeForResource(ResourceInterface $resource, array $data)
    {
        $structure = Object::make($resource->getSrcClassname());
        $structure->makeFinal();
        $construct = Method::make('__construct');
        $structure->addMethod($construct);
        $constructBody = [];
        foreach ($data['params'] as $param) {
            $structure->addProperty(Property::make($param));
            $body = <<<METHOD
        return \$this->{$param};
METHOD;
            $construct->addArgument(Argument::make('mixed', $param));
            $constructBody[] = "        \$this->{$param} = \${$param};";
            $method = Method::make($param)->setBody($body);
            $structure->addMethod($method);
        }
        $construct->setBody(implode("\n", $constructBody));
        $file = File::make($resource->getSrcFilename())->setStructure($structure);
        $prettyPrinter = Build::prettyPrinter();
        return $prettyPrinter->generateCode($file);
    }
Example #8
0
 public function generate($class, $param = NULL)
 {
     // Describe the code you want to generate using "Models"
     $this->_class = Object::make(ucfirst($class));
     if ($param['property'] !== NULL) {
         if (is_array($param['property'])) {
             foreach ($param['property'] as $property) {
                 $this->_class->addProperty(Property::make($property));
             }
         } elseif (is_string($param['property'])) {
             $this->_class->addProperty(Property::make($param['property']));
         }
     }
     if ($param['method'] !== NULL) {
         if (is_array($param['method'])) {
             foreach ($param['method'] as $method) {
                 if (is_array($method)) {
                     foreach ($method as $name => $arguments) {
                         $this->_method = Method::make($name);
                         foreach ($arguments as $kind => $argument) {
                             $this->_method->addArgument(Argument::make($kind, $argument));
                         }
                     }
                     $this->_class->addMethod($this->_method);
                 } elseif (is_string($method)) {
                     $this->_class->addMethod(Method::make($method));
                 }
             }
         } elseif (is_string($param['method'])) {
             $this->_class->addMethod(Method::make($param['method']));
         }
     }
     $file = File::make(ucfirst($class) . 'php')->setStructure($this->_class);
     // Generate the code and display in the console
     $prettyPrinter = Build::prettyPrinter();
     echo '<pre>' . htmlspecialchars($prettyPrinter->generateCode($file)) . '</pre>';
 }
 public function testDefaultValue()
 {
     $property = Property::make('property')->setDefaultValue("'default'");
     $generatedCode = $this->prettyPrinter->generateCode($property);
     $this->assertSame('    private $property = \'default\';', $generatedCode);
 }
 function it_inserts_property_in_class_with_methods(Editor $editor, File $file, PrettyPrinter $prettyPrinter, Property $property)
 {
     $insertProperty = new InsertProperty($file->getWrappedObject(), $property->getWrappedObject());
     $property->getName()->willReturn('property');
     $editor->hasBelow($file, '/^    private \\$property;$/', 0)->willReturn(false);
     $editor->hasBelow($file, InsertPropertyHandler::PROPERTY, 0)->willReturn(false);
     $editor->hasBelow($file, InsertPropertyHandler::CONSTANT, 0)->willReturn(false);
     $editor->jumpBelow($file, InsertPropertyHandler::CLASS_OPENING, 0)->shouldBeCalled();
     $prettyPrinter->generateCode($property)->willReturn('    private $property;');
     $editor->insertBelow($file, '    private $property;')->shouldBeCalled();
     $file->incrementCurrentLineNumber(1)->shouldBeCalled();
     $file->getLine()->willReturn('    public function __construct($property)');
     $editor->insertAbove($file, '')->shouldBeCalled();
     $this->handle($insertProperty);
 }
Example #11
0
    protected function generateRepositoryModel($modulePath, $moduleName, $modelName, array $fields)
    {
        $resourceModelName = basename($modelName) . 'Resource';
        $resourceModelFqn = str_replace('/', '\\', "{$moduleName}/Model/ResourceModel/{$modelName}");
        $collectionFactoryName = 'CollectionFactory';
        $collectionFactoryFqn = str_replace('/', '\\', "{$moduleName}/Model/ResourceModel/{$modelName}/CollectionFactory");
        $searchResultsFactoryName = basename($modelName) . 'SearchResultsInterfaceFactory';
        $searchResultsFactoryFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}SearchResultsInterfaceFactory");
        $searchResultsContractName = basename($modelName) . 'SearchResultsInterface';
        $searchResultsContractFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}SearchResultsInterface");
        $dataContractName = basename($modelName) . 'Interface';
        $dataContractFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}Interface");
        $dataFactoryName = basename($modelName) . 'InterfaceFactory';
        $dataFactoryFqn = str_replace('/', '\\', "{$moduleName}/Api/Data/{$modelName}InterfaceFactory");
        $factoryName = basename($modelName) . 'Factory';
        $model = Object::make(str_replace('/', '\\', "{$moduleName}/Model/{$modelName}Repository"));
        $model->implement(Contract::make(str_replace('/', '\\', "{$moduleName}/Api/{$modelName}RepositoryInterface")));
        $__constructBody = '        $this->resource             = $resource;
        $this->factory              = $factory;
        $this->collectionFactory    = $collectionFactory;
        $this->searchResultsFactory = $searchResultsFactory;
        $this->dataFactory          = $dataFactory;
        $this->dataObjectHelper     = $dataObjectHelper;
        $this->dataObjectProcessor  = $dataObjectProcessor;
        $this->storeManager         = $storeManager;';
        $model->addProperty(Property::make('resource')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($resourceModelName))));
        $model->addProperty(Property::make('factory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($factoryName))));
        $model->addProperty(Property::make('collectionFactory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($collectionFactoryName))));
        $model->addProperty(Property::make('searchResultsFactory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($searchResultsFactoryName))));
        $model->addProperty(Property::make('dataFactory')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag($dataFactoryName))));
        $model->addProperty(Property::make('dataObjectHelper')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag('DataObjectHelper'))));
        $model->addProperty(Property::make('dataObjectProcessor')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag('DataObjectProcessor'))));
        $model->addProperty(Property::make('storeManager')->makeProtected()->setPhpdoc(PropertyPhpdoc::make()->setVariableTag(new VariableTag('StoreManagerInterface'))));
        $model->addMethod(Method::make('__construct')->setBody($__constructBody)->addArgument(new Argument($resourceModelName, 'resource'))->addArgument(new Argument($factoryName, 'factory'))->addArgument(new Argument($collectionFactoryName, 'collectionFactory'))->addArgument(new Argument($searchResultsFactoryName, 'searchResultsFactory'))->addArgument(new Argument($dataFactoryName, 'dataFactory'))->addArgument(new Argument('DataObjectHelper', 'dataObjectHelper'))->addArgument(new Argument('DataObjectProcessor', 'dataObjectProcessor'))->addArgument(new Argument('StoreManagerInterface', 'storeManager'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($resourceModelName, 'resource'))->addParameterTag(new ParameterTag($factoryName, 'factory'))->addParameterTag(new ParameterTag($collectionFactoryName, 'collectionFactory'))->addParameterTag(new ParameterTag($searchResultsFactoryName, 'searchResultsFactory'))->addParameterTag(new ParameterTag($dataFactoryName, 'dataFactory'))->addParameterTag(new ParameterTag('DataObjectHelper', 'dataObjectHelper'))->addParameterTag(new ParameterTag('DataObjectProcessor', 'dataObjectProcessor'))->addParameterTag(new ParameterTag('StoreManagerInterface', 'storeManager'))));
        $model->addMethod(Method::make('getById')->setBody('        $object = $this->factory->create();
        $this->resource->load($object, $id);
        if (!$object->getId()) {
            throw new NoSuchEntityException("Object not found");
        }

        return $object;')->addArgument(new Argument('int', 'id'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag('int', 'id'))->setReturnTag(new ReturnTag($dataContractName))->addThrowTag(new ThrowTag('NoSuchEntityException'))));
        $model->addMethod(Method::make('save')->setBody('        $this->resource->save($object);

        return $object;')->addArgument(new Argument($dataContractName, 'object'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($dataContractName, 'object'))->setReturnTag(new ReturnTag($dataContractName))));
        $getListBody = '        $searchResults = $this->searchResultsFactory->create();
        $searchResults->setSearchCriteria($criteria);

        $collection = $this->collectionFactory->create();
        foreach ($criteria->getFilterGroups() as $filterGroup) {
            foreach ($filterGroup->getFilters() as $filter) {
                $condition = $filter->getConditionType() ?: \'eq\';
                $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
            }
        }
        $searchResults->setTotalCount($collection->getSize());
        $sortOrders = $criteria->getSortOrders();
        if ($sortOrders) {
            /** @var SortOrder $sortOrder */
            foreach ($sortOrders as $sortOrder) {
                $collection->addOrder(
                    $sortOrder->getField(),
                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? \'ASC\' : \'DESC\'
                );
            }
        }
        $collection->setCurPage($criteria->getCurrentPage());
        $collection->setPageSize($criteria->getPageSize());
        $objects = [];
        /** @var ' . $dataContractName . ' $object */
        foreach ($collection as $object) {
            $data = $this->dataFactory->create();
            $this->dataObjectHelper->populateWithArray(
                $data,
                $object->getData(),
                \'' . $dataContractFqn . '\'
            );
            $objects[] = $this->dataObjectProcessor->buildOutputDataArray(
                $data,
                \'' . $dataContractFqn . '\'
            );
        }
        $searchResults->setItems($objects);

        return $searchResults;';
        $model->addMethod(Method::make('getList')->setBody($getListBody)->addArgument(new Argument('SearchCriteriaInterface', 'criteria'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag('SearchCriteriaInterface', 'criteria'))->setReturnTag(new ReturnTag($searchResultsContractName))));
        $model->addMethod(Method::make('delete')->setBody('        $this->resource->delete($object);

        return true;')->addArgument(new Argument($dataContractName, 'object'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag($dataContractName, 'object'))->setReturnTag(new ReturnTag('bool'))));
        $model->addMethod(Method::make('deleteById')->setBody('        return $this->resource->delete($this->getById($id));')->addArgument(new Argument('int', 'id'))->setPhpdoc(MethodPhpdoc::make()->addParameterTag(new ParameterTag('int', 'id'))->setReturnTag(new ReturnTag('bool'))));
        $this->dumpObject($model, "{$modulePath}/Model/{$modelName}Repository.php", [[$resourceModelName => $resourceModelFqn], $collectionFactoryFqn, $searchResultsFactoryFqn, $dataFactoryFqn, $dataContractFqn, $searchResultsContractFqn, 'Magento\\Framework\\Api\\DataObjectHelper', 'Magento\\Framework\\Reflection\\DataObjectProcessor', 'Magento\\Framework\\Api\\SortOrder', 'Magento\\Store\\Model\\StoreManagerInterface', 'Magento\\Framework\\Exception\\NoSuchEntityException', 'Magento\\Framework\\Api\\SearchCriteriaInterface']);
        return $this;
    }