From 6896c6571432ff24e74aeb0be512d0ba078e0145 Mon Sep 17 00:00:00 2001 From: Nemanja Paradjina Date: Fri, 2 Dec 2022 13:39:19 +0100 Subject: [PATCH 1/3] Added support for PHP 8.0 --- .github/workflows/workflow.yml | 2 +- README.md | 1 + src/Twig/Node/ComponentNode.php | 2 +- src/Twig/TokenParser/ComponentTokenParser.php | 2 +- test/Twig/Node/ComponentNodeTest.php | 16 ++++++++-------- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 4c56634..6bcd88e 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php_version: ['7.3', '7.4'] + php_version: ['7.3', '7.4', '8.0'] steps: - name: Setup PHP ${{ matrix.php_version }} diff --git a/README.md b/README.md index 556b17d..c210303 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ $ composer require namics/terrific-twig The following versions of PHP are currently supported. * 7.3 * 7.4 +* 8.0 ## Setup Step 1: Implement `TemplateInformationProvider` diff --git a/src/Twig/Node/ComponentNode.php b/src/Twig/Node/ComponentNode.php index 507bdab..d6bf9f6 100644 --- a/src/Twig/Node/ComponentNode.php +++ b/src/Twig/Node/ComponentNode.php @@ -60,8 +60,8 @@ public function __construct( Node $component, ContextProviderInterface $ctxProvider, Node $data, - $only = FALSE, $lineno, + $only = FALSE, $tag = NULL ) { parent::__construct( diff --git a/src/Twig/TokenParser/ComponentTokenParser.php b/src/Twig/TokenParser/ComponentTokenParser.php index 02428ce..ca16a7a 100644 --- a/src/Twig/TokenParser/ComponentTokenParser.php +++ b/src/Twig/TokenParser/ComponentTokenParser.php @@ -44,7 +44,7 @@ public function parse(Token $token): ComponentNode { $component = $this->parser->getExpressionParser()->parseExpression(); list($data, $only) = $this->parseArguments(); - return new ComponentNode($component, $this->ctxProvider, $data, $only, $token->getLine(), $this->getTag()); + return new ComponentNode($component, $this->ctxProvider, $data, $token->getLine(), $only, $this->getTag()); } /** diff --git a/test/Twig/Node/ComponentNodeTest.php b/test/Twig/Node/ComponentNodeTest.php index 8460fba..9693bac 100644 --- a/test/Twig/Node/ComponentNodeTest.php +++ b/test/Twig/Node/ComponentNodeTest.php @@ -27,7 +27,7 @@ public function testConstructor() { $expression = new Twig_Node_Expression_Constant('Example', 1); $data = new Twig_Node_Expression_Array([], 1); - $node = new ComponentNode($expression, $ctxProvider, $data, FALSE, 0, NULL); + $node = new ComponentNode($expression, $ctxProvider, $data, 0, FALSE, NULL); /** @var \Twig\Node\Expression\ArrayExpression $nodeData */ $nodeData = $node->getNode('data'); @@ -40,7 +40,7 @@ public function testConstructor() { new Twig_Node_Expression_Constant(TRUE, 1), ], 1); - $node = new ComponentNode($expression, $ctxProvider, $data, TRUE, 1, NULL); + $node = new ComponentNode($expression, $ctxProvider, $data, 1, TRUE, NULL); $this->assertEquals($data, $node->getNode('data'), 'The data is not identical.'); $this->assertTrue($node->getAttribute('only'), 'The "only" attribute is not TRUE.'); @@ -70,7 +70,7 @@ public function testConstructor() { private function getDefaultTest() { $expr = new ConstantExpression('Example', 1); $data = new ArrayExpression([], 1); - $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, FALSE, 1, NULL); + $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, 1, FALSE,NULL); return [ 'node' => $node, @@ -92,7 +92,7 @@ private function getDefaultTest() { private function getDefaultOnlyTest() { $expr = new ConstantExpression('Example', 1); $data = new ArrayExpression([], 1); - $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, TRUE, 1, NULL); + $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, 1, TRUE, NULL); return [ 'node' => $node, @@ -116,7 +116,7 @@ private function getDataObjectTest() { new ConstantExpression('foo', 1), new ConstantExpression('bar', 1), ], 1); - $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, FALSE, 1, NULL); + $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, 1, FALSE, NULL); return [ 'node' => $node, @@ -138,7 +138,7 @@ private function getDataObjectOnlyTest() { new ConstantExpression('foo', 1), new ConstantExpression('bar', 1), ], 1); - $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, TRUE, 1, NULL); + $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, 1, TRUE,NULL); return [ 'node' => $node, @@ -157,7 +157,7 @@ private function getDataObjectOnlyTest() { private function getVariantTest() { $expr = new ConstantExpression('Example', 1); $data = new ConstantExpression('example-foo', 1); - $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, FALSE, 1, NULL); + $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, 1, FALSE, NULL); return [ 'node' => $node, @@ -174,7 +174,7 @@ private function getVariantTest() { private function getVariantOnlyTest() { $expr = new ConstantExpression('Example', 1); $data = new ConstantExpression('example-foo', 1); - $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, TRUE, 1, NULL); + $node = new ComponentNode($expr, $this->getContextProviderMock(), $data, 1, TRUE, NULL); return [ 'node' => $node, From 2f8b161dd6c179b4ad467e5af9b5ec65453c4e3c Mon Sep 17 00:00:00 2001 From: nparadjina Date: Tue, 6 Dec 2022 11:27:04 +0100 Subject: [PATCH 2/3] Updating phpunit version (php-compatibility) --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e61cf93..c515718 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "twig/twig": "^2.13" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.0" }, "scripts": { "tests": [ From f07f34d347bedcc0a72a106952e80a340a32dcf2 Mon Sep 17 00:00:00 2001 From: Radoslav Damjanov Date: Fri, 27 Oct 2023 13:56:23 +0200 Subject: [PATCH 3/3] Add support for PHP 8.1 and Twig 3.x version. --- .github/workflows/workflow.yml | 2 +- README.md | 11 +++++------ composer.json | 4 ++-- phpunit.xml | 1 - src/Config/ConfigReader.php | 11 +++++++---- src/Provider/ContextProviderInterface.php | 2 ++ .../TemplateInformationProviderInterface.php | 2 ++ .../Data/VariableNameAndArrayKeysPair.php | 7 +++++-- src/Twig/Extension/TerrificExtension.php | 4 +++- src/Twig/Loader/TerrificLoader.php | 2 ++ src/Twig/Node/ComponentNode.php | 19 +++++++++++-------- src/Twig/TerrificCompiler.php | 13 +++++++++---- src/Twig/TerrificCompilerInterface.php | 2 ++ src/Twig/TokenParser/ComponentTokenParser.php | 4 +++- src/Twig/Utility/ExpressionHandler.php | 8 ++++---- test/Twig/Extension/TerrificExtensionTest.php | 2 ++ test/Twig/Loader/TerrificLoaderTest.php | 6 ++++-- test/Twig/Node/ComponentNodeTest.php | 16 ++++++++-------- .../TokenParser/ComponentTokenParserTest.php | 2 ++ test/Twig/TwigTestBase.php | 2 ++ 20 files changed, 76 insertions(+), 44 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 6bcd88e..a42ced9 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php_version: ['7.3', '7.4', '8.0'] + php_version: ['8.0', '8.1'] steps: - name: Setup PHP ${{ matrix.php_version }} diff --git a/README.md b/README.md index c210303..661957f 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,8 @@ $ composer require namics/terrific-twig ## Requirements The following versions of PHP are currently supported. -* 7.3 -* 7.4 * 8.0 +* 8.1 ## Setup Step 1: Implement `TemplateInformationProvider` @@ -47,7 +46,7 @@ Step 2: Implement `ContextProviderInterface` ```php class ContextProvider implements ContextProviderInterface { - public function compile(Twig_Compiler $compiler, Twig_Node $component, Twig_Node $dataVariant, $only) { + public function compile(\Twig\Compiler $compiler, \Twig\Node\Node $component, \Twig\Node\Node $dataVariant, $only) { // ... } } @@ -56,13 +55,13 @@ class ContextProvider implements ContextProviderInterface Step 3: Add `TerrificLoader` ```php $loader = ...; -$chain = new Twig_Loader_Chain([$loader, new TerrificLoader(new TemplateInformationProvider)]); -$twig = new Twig_Environment($chain); +$chain = new \Twig\Loader\ChainLoader([$loader, new TerrificLoader(new TemplateInformationProvider)]); +$twig = new \Twig\Environment($chain); ``` Step 4: Add `TerrificExtension` ```php -$twig = new Twig_Environment($chain); +$twig = new \Twig\Environment($chain); $twig->addExtension(new TerrificExtension(new ContextProvider)); ``` diff --git a/composer.json b/composer.json index c515718..b141669 100644 --- a/composer.json +++ b/composer.json @@ -30,8 +30,8 @@ } }, "require": { - "php": ">=7.3", - "twig/twig": "^2.13" + "php": ">=8.0", + "twig/twig": "^3.6" }, "require-dev": { "phpunit/phpunit": "^9.0" diff --git a/phpunit.xml b/phpunit.xml index ed88315..1707eed 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="vendor/autoload.php" > diff --git a/src/Config/ConfigReader.php b/src/Config/ConfigReader.php index d73de38..8243d6e 100644 --- a/src/Config/ConfigReader.php +++ b/src/Config/ConfigReader.php @@ -1,5 +1,7 @@ readConfig($path); } @@ -56,8 +58,9 @@ public function getConfig(): array { * * @param string $path * The path to the config file. + * @return void */ - protected function readConfig(string $path) { + protected function readConfig(string $path): void { if (is_readable($path)) { try { $this->config = json_decode(file_get_contents($path), TRUE); @@ -67,7 +70,7 @@ protected function readConfig(string $path) { } } catch (DomainException $e) { - throw $e; + throw new DomainException($e->getMessage()); } } } diff --git a/src/Provider/ContextProviderInterface.php b/src/Provider/ContextProviderInterface.php index 278461e..edd69a8 100644 --- a/src/Provider/ContextProviderInterface.php +++ b/src/Provider/ContextProviderInterface.php @@ -1,5 +1,7 @@ isVariableNameEmpty()) { diff --git a/src/Twig/Extension/TerrificExtension.php b/src/Twig/Extension/TerrificExtension.php index 52275e1..ddb8585 100644 --- a/src/Twig/Extension/TerrificExtension.php +++ b/src/Twig/Extension/TerrificExtension.php @@ -1,5 +1,7 @@ $component, 'data' => $data], @@ -129,8 +131,9 @@ protected function createTerrificContext(TerrificCompilerInterface $terrificComp * IMPORTANT: Has to be executed after the Terrific context was created * (ComponentNode::createTerrificContext). * - * @param \Namics\Terrific\Twig\TerrificCompilerInterface $terrificCompiler + * @param TerrificCompilerInterface $terrificCompiler * The Terrific Twig compiler. + * @throws SyntaxError */ protected function addGetTemplate(TerrificCompilerInterface $terrificCompiler): void { $twigCompiler = $terrificCompiler->getTwigCompiler(); @@ -161,7 +164,7 @@ protected function compileComponentName(TerrificCompilerInterface $terrificCompi $node = $this->getNode('component'); /* If a variable is used for component name, - use it's value (is inside Terrifc context "$tContext") for template name. + use its value (is inside Terrifc context "$tContext") for template name. E.g. {% component myTwigComponentName { dataItem: 'my string' } %} */ if ($node instanceof NameExpression) { $terrificCompiler->compileNameExpressionAsContextVariable($node); @@ -173,7 +176,7 @@ protected function compileComponentName(TerrificCompilerInterface $terrificCompi $terrificCompiler->getTwigCompiler()->subcompile($node); } /* If an object object/array used for component name, - use it's value (is inside Terrifc context "$tContext") for template name. + use its value (is inside Terrifc context "$tContext") for template name. E.g. {% component myTwigObject.anObjectProperty.myTwigComponentName { dataItem: 'my string' } %} */ elseif ($node instanceof GetAttrExpression) { $terrificCompiler->compileGetAttrExpressionAsContextVariable($node); diff --git a/src/Twig/TerrificCompiler.php b/src/Twig/TerrificCompiler.php index 3ecec28..629dd2d 100644 --- a/src/Twig/TerrificCompiler.php +++ b/src/Twig/TerrificCompiler.php @@ -1,5 +1,7 @@ getExpressionHandler()->getVariableNameFromNameExpression($expression); @@ -138,13 +142,14 @@ public function compileAndMergeGetAttrExpressionToContext(GetAttrExpression $exp /** * Checks if given variable exists, and adds it to the context. * - * So it it's data is available in the compiled component. + * So it its data is available in the compiled component. * - * @param \Namics\Terrific\Twig\Data\VariableNameAndArrayKeysPair $variableNameAndArrayKeysPair + * @param VariableNameAndArrayKeysPair $variableNameAndArrayKeysPair * Object containing the variable name and optionally array keys. * @param string|null $variableDoesNotExistErrorMessage * Custom error message that is used as exception message * when the given variable does not exist. + * @throws Error */ public function compileAndMergeVariableToContext(VariableNameAndArrayKeysPair $variableNameAndArrayKeysPair, ?string $variableDoesNotExistErrorMessage = NULL): void { $twigCompiler = $this->getTwigCompiler(); diff --git a/src/Twig/TerrificCompilerInterface.php b/src/Twig/TerrificCompilerInterface.php index ac6a587..5f02292 100644 --- a/src/Twig/TerrificCompilerInterface.php +++ b/src/Twig/TerrificCompilerInterface.php @@ -1,5 +1,7 @@ hasNode('node') && $expression->getNode('node') instanceof GetAttrExpression; - - return $isNestedObject; + return $expression->hasNode('node') && $expression->getNode('node') instanceof GetAttrExpression; } /** diff --git a/test/Twig/Extension/TerrificExtensionTest.php b/test/Twig/Extension/TerrificExtensionTest.php index aa8bab5..d5fd790 100644 --- a/test/Twig/Extension/TerrificExtensionTest.php +++ b/test/Twig/Extension/TerrificExtensionTest.php @@ -1,5 +1,7 @@ assertInstanceOf(LoaderError::class, $exception, 'Exception "' . LoaderError::class . '" was not thrown.'); - $this->assertContains('Unable to find template "fake-component.twig"', $exception->getMessage(), 'Exception message is not identical.'); + $this->assertStringContainsString('Unable to find template "fake-component.twig"', $exception->getMessage(), 'Exception message is not identical.'); } // Check if the cache is invoked. @@ -107,7 +109,7 @@ public function testTemplateLoading(): void { } catch (Exception $exception) { $this->assertInstanceOf(LoaderError::class, $exception, 'Exception "' . LoaderError::class . '" was not thrown.'); - $this->assertContains('Unable to find template "fake-component.twig"', $exception->getMessage(), 'Exception message is not identical.'); + $this->assertStringContainsString('Unable to find template "fake-component.twig"', $exception->getMessage(), 'Exception message is not identical.'); } } diff --git a/test/Twig/Node/ComponentNodeTest.php b/test/Twig/Node/ComponentNodeTest.php index 9693bac..652772a 100644 --- a/test/Twig/Node/ComponentNodeTest.php +++ b/test/Twig/Node/ComponentNodeTest.php @@ -1,13 +1,13 @@ getContextProviderMock(); - $expression = new Twig_Node_Expression_Constant('Example', 1); - $data = new Twig_Node_Expression_Array([], 1); + $expression = new ConstantExpression('Example', 1); + $data = new ArrayExpression([], 1); $node = new ComponentNode($expression, $ctxProvider, $data, 0, FALSE, NULL); /** @var \Twig\Node\Expression\ArrayExpression $nodeData */ @@ -35,9 +35,9 @@ public function testConstructor() { $this->assertEquals($expression, $node->getNode('component'), 'The expressions are not identical.'); $this->assertFalse($node->getAttribute('only'), 'The "only" attribute is not FALSE.'); - $data = new Twig_Node_Expression_Array([ - new Twig_Node_Expression_Constant('foo', 1), - new Twig_Node_Expression_Constant(TRUE, 1), + $data = new ArrayExpression([ + new ConstantExpression('foo', 1), + new ConstantExpression(TRUE, 1), ], 1); $node = new ComponentNode($expression, $ctxProvider, $data, 1, TRUE, NULL); diff --git a/test/Twig/TokenParser/ComponentTokenParserTest.php b/test/Twig/TokenParser/ComponentTokenParserTest.php index 98013ff..6cde611 100644 --- a/test/Twig/TokenParser/ComponentTokenParserTest.php +++ b/test/Twig/TokenParser/ComponentTokenParserTest.php @@ -1,5 +1,7 @@