Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce ENV array element manifest type #160

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
"ext-dom": "*",
"ext-simplexml": "*",
"ext-json": "*",
"aws/aws-sdk-php": "^3.257",
"composer-plugin-api": "^1.0.0 || ^2.0.0",
"aws/aws-sdk-php": "^3.257",
"composer/composer": "^2.1.0",
"czproject/git-php": "^4.1",
"guzzlehttp/guzzle": "^7.4",
Expand All @@ -24,7 +24,7 @@
"ext-zip": "*",
"phpstan/phpstan": "^1.0.0",
"phpunit/phpunit": "^9.5.0",
"spryker-sdk/manifest-test-data-provider": "dev-master",
"spryker-sdk/manifest-test-data-provider": "dev-feature/sdk-5377-introduce-array-element-to-env-manifeststrategy",
"spryker/code-sniffer": "0.17.18",
"symfony/filesystem": "^5.3.0 || ^6.0"
},
Expand Down
4 changes: 2 additions & 2 deletions src/Builder/ClassBuilderFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public function resolveClass(string $targetClassName, string $customOrganisation
public function storeClass(ClassInformationTransfer $classInformationTransfer): bool
{
return $this->getFactory()
->createClassFileWriter()
->storeClass($classInformationTransfer);
->createFileWriter()
->storeFile($classInformationTransfer);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Builder/ClassGenerator/ClassGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function generateClass(string $className, ?string $parentClass = null): C

$syntaxTree = [$classNamespaceBuilder->getNode()];

$classInformationTransfer->setClassTokenTree($syntaxTree)
$classInformationTransfer->setTokenTree($syntaxTree)
->setFilePath(
$moduleDir
. '/src'
Expand Down
53 changes: 53 additions & 0 deletions src/Builder/ClassLoader/AbstractLoader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassLoader;

use PhpParser\Lexer;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\CloningVisitor;
use PhpParser\NodeVisitor\NameResolver;
use PhpParser\Parser;

abstract class AbstractLoader
{
/**
* @var \PhpParser\Parser
*/
protected $parser;

/**
* @var \PhpParser\Lexer
*/
protected $lexer;

/**
* @param \PhpParser\Parser $parser
* @param \PhpParser\Lexer $lexer
*/
public function __construct(Parser $parser, Lexer $lexer)
{
$this->parser = $parser;
$this->lexer = $lexer;
}

/**
* @param array<\PhpParser\Node\Stmt> $originalSyntaxTree
*
* @return array<\PhpParser\Node>
*/
protected function traverseOriginalSyntaxTree(array $originalSyntaxTree): array
{
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new NameResolver());
$nodeTraverser->addVisitor(new CloningVisitor());

return $nodeTraverser->traverse($originalSyntaxTree);
}
}
45 changes: 3 additions & 42 deletions src/Builder/ClassLoader/ClassLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,44 +10,19 @@
namespace SprykerSdk\Integrator\Builder\ClassLoader;

use Composer\Autoload\ClassLoader as ComposerClassLoader;
use PhpParser\Lexer;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\NodeFinder;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\CloningVisitor;
use PhpParser\NodeVisitor\NameResolver;
use PhpParser\Parser;
use SprykerSdk\Integrator\Transfer\ClassInformationTransfer;

class ClassLoader implements ClassLoaderInterface
class ClassLoader extends AbstractLoader implements ClassLoaderInterface
{
/**
* @var \Composer\Autoload\ClassLoader|null
*/
private static ?ComposerClassLoader $composerClassLoader = null;

/**
* @var \PhpParser\Parser
*/
protected $parser;

/**
* @var \PhpParser\Lexer
*/
protected $lexer;

/**
* @param \PhpParser\Parser $parser
* @param \PhpParser\Lexer $lexer
*/
public function __construct(Parser $parser, Lexer $lexer)
{
$this->parser = $parser;
$this->lexer = $lexer;
}

/**
* @param string $className
*
Expand All @@ -74,8 +49,8 @@ public function loadClass(string $className): ClassInformationTransfer
$originalSyntaxTree = $this->parser->parse($fileContents);
$syntaxTree = $originalSyntaxTree ? $this->traverseOriginalSyntaxTree($originalSyntaxTree) : [];

$classInformationTransfer->setClassTokenTree($syntaxTree)
->setOriginalClassTokenTree($originalSyntaxTree)
$classInformationTransfer->setTokenTree($syntaxTree)
->setOriginalTokenTree($originalSyntaxTree)
->setTokens($this->lexer->getTokens())
->setFilePath(realpath($fileName));

Expand Down Expand Up @@ -116,20 +91,6 @@ protected function getParent(array $originalSyntaxTree): ?string
return null;
}

/**
* @param array<\PhpParser\Node\Stmt> $originalSyntaxTree
*
* @return array<\PhpParser\Node>
*/
protected function traverseOriginalSyntaxTree(array $originalSyntaxTree): array
{
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new CloningVisitor());
$nodeTraverser->addVisitor(new NameResolver());

return $nodeTraverser->traverse($originalSyntaxTree);
}

/**
* @param string $className
*
Expand Down
43 changes: 43 additions & 0 deletions src/Builder/ClassLoader/FileLoader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassLoader;

use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

class FileLoader extends AbstractLoader implements FileLoaderInterface
{
/**
* @param string $path
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function loadFile(string $path): FileInformationTransfer
{
$fileInformationTransfer = (new FileInformationTransfer())->setFilePath($path);
if (!file_exists($path)) {
return $fileInformationTransfer;
}

$fileContents = file_get_contents($path);
if (!$fileContents) {
return $fileInformationTransfer;
}
$fileInformationTransfer->setContent($fileContents);

$originalSyntaxTree = $this->parser->parse($fileContents);
$syntaxTree = $originalSyntaxTree ? $this->traverseOriginalSyntaxTree($originalSyntaxTree) : [];

$fileInformationTransfer->setTokenTree($syntaxTree)
->setOriginalTokenTree($originalSyntaxTree)
->setTokens($this->lexer->getTokens());

return $fileInformationTransfer;
}
}
22 changes: 22 additions & 0 deletions src/Builder/ClassLoader/FileLoaderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassLoader;

use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

interface FileLoaderInterface
{
/**
* @param string $path
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function loadFile(string $path): FileInformationTransfer;
}
4 changes: 2 additions & 2 deletions src/Builder/ClassModifier/AddVisitorsTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ protected function addVisitorsClassInformationTransfer(ClassInformationTransfer
$nodeTraverser->addVisitor($visitor);
}

$classInformationTransfer->setClassTokenTree(
$nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()),
$classInformationTransfer->setTokenTree(
$nodeTraverser->traverse($classInformationTransfer->getTokenTree()),
);

return $classInformationTransfer;
Expand Down
8 changes: 4 additions & 4 deletions src/Builder/ClassModifier/CommonClass/CommonClassModifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public function overrideMethodFromParent(ClassInformationTransfer $classInformat

$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new AddMethodVisitor($methodSyntaxTree));
$classInformationTransfer->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
$classInformationTransfer->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down Expand Up @@ -156,7 +156,7 @@ public function replaceMethodBody(
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new ReplaceNodePropertiesByNameVisitor($targetMethodName, $methodNodeProperties));
$classInformationTransfer
->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand All @@ -172,7 +172,7 @@ public function removeClassMethod(ClassInformationTransfer $classInformationTran
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new RemoveMethodVisitor($methodNameToRemove));
$classInformationTransfer
->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down Expand Up @@ -234,7 +234,7 @@ protected function appendNonLiteralArrayValueToMethodBody(
$nodeTraverser->addVisitor(new AddStatementToStatementListVisitor($methodName, $arrayItems, $nodeComparer));

return $classInformationTransfer
->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));
}

/**
Expand Down
60 changes: 60 additions & 0 deletions src/Builder/ClassModifier/ConfigFile/ConfigFileModifier.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassModifier\ConfigFile;

use PhpParser\Node;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\NodeFinder;
use PhpParser\NodeTraverser;
use SprykerSdk\Integrator\Builder\PartialParser\ExpressionPartialParserInterface;
use SprykerSdk\Integrator\Builder\Visitor\AddArrayItemToEnvConfigVisitor;
use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

class ConfigFileModifier implements ConfigFileModifierInterface
{
protected ExpressionPartialParserInterface $expressionPartialParser;

/**
* @param \SprykerSdk\Integrator\Builder\PartialParser\ExpressionPartialParserInterface $expressionPartialParser
*/
public function __construct(ExpressionPartialParserInterface $expressionPartialParser)
{
$this->expressionPartialParser = $expressionPartialParser;
}

/**
* @param \SprykerSdk\Integrator\Transfer\FileInformationTransfer $fileInformationTransfer
* @param string $target
* @param string $value
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function addArrayItemToEnvConfig(
FileInformationTransfer $fileInformationTransfer,
string $target,
string $value
): FileInformationTransfer {
$valueStm = $this->expressionPartialParser->parse(sprintf('$var = %s;', $value));

/** @var \PhpParser\Node\Expr\ArrayItem|null $arrayItem */
$arrayItem = (new NodeFinder())->findFirst($valueStm, function (Node $node) {
return $node instanceof ArrayItem;
});
if (!$arrayItem) {
return $fileInformationTransfer;
}

$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new AddArrayItemToEnvConfigVisitor($target, $arrayItem));

return $fileInformationTransfer
->setTokenTree($nodeTraverser->traverse($fileInformationTransfer->getTokenTree()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassModifier\ConfigFile;

use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

interface ConfigFileModifierInterface
{
/**
* @param \SprykerSdk\Integrator\Transfer\FileInformationTransfer $fileInformationTransfer
* @param string $target
* @param string $value
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function addArrayItemToEnvConfig(FileInformationTransfer $fileInformationTransfer, string $target, string $value): FileInformationTransfer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function unwire(

[$keyClass, $keyConst] = explode('::', $key);
$this->nodeTraverser->addVisitor(new RemoveGlueRelationshipFromClassListVisitor($targetMethodName, $keyClass, $keyConst, $classNameToRemove));
$classInformationTransfer->setClassTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
$classInformationTransfer->setTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public function wire(
$methodBody = $this->getMethodBody($methodNode, $classNameToAdd, $keyClass, $keyConst);

$this->nodeTraverser->addVisitor(new MethodBodyExtendVisitor($targetMethodName, $methodBody));
$classInformationTransfer->setClassTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
$classInformationTransfer->setTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down
Loading
Loading