From 4e42ff8cb7814712c54c7edf6acc909729b97424 Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 13 Aug 2019 22:47:27 +0100 Subject: [PATCH] Updated twig extension for twig 2.11 --- .../Extension/Twig/AsseticExtension.php | 5 +- .../Extension/Twig/AsseticFilterFunction.php | 14 +- .../Extension/Twig/AsseticFilterNode.php | 11 -- .../Extension/Twig/TwigFormulaLoader.php | 97 ------------- .../Extension/Twig/AsseticExtensionTest.php | 11 +- .../Extension/Twig/TwigFormulaLoaderTest.php | 135 ------------------ .../Test/Extension/Twig/TwigResourceTest.php | 4 +- 7 files changed, 19 insertions(+), 258 deletions(-) delete mode 100644 src/Assetic/Extension/Twig/AsseticFilterNode.php delete mode 100644 src/Assetic/Extension/Twig/TwigFormulaLoader.php delete mode 100644 tests/Assetic/Test/Extension/Twig/TwigFormulaLoaderTest.php diff --git a/src/Assetic/Extension/Twig/AsseticExtension.php b/src/Assetic/Extension/Twig/AsseticExtension.php index 6d367fb..55b87ce 100644 --- a/src/Assetic/Extension/Twig/AsseticExtension.php +++ b/src/Assetic/Extension/Twig/AsseticExtension.php @@ -2,8 +2,9 @@ use Assetic\Factory\AssetFactory; use Assetic\Contracts\ValueSupplierInterface; +use Twig\Extension\GlobalsInterface; -class AsseticExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface +class AsseticExtension extends \Twig_Extension implements GlobalsInterface { protected $factory; protected $functions; @@ -37,7 +38,7 @@ public function getFunctions() { $functions = array(); foreach ($this->functions as $function => $filter) { - $functions[] = new AsseticFilterFunction($function); + $functions[] = AsseticFilterFunction::make($this, $function); } return $functions; diff --git a/src/Assetic/Extension/Twig/AsseticFilterFunction.php b/src/Assetic/Extension/Twig/AsseticFilterFunction.php index dceb313..43ca1cf 100644 --- a/src/Assetic/Extension/Twig/AsseticFilterFunction.php +++ b/src/Assetic/Extension/Twig/AsseticFilterFunction.php @@ -1,13 +1,13 @@ false, - 'needs_context' => false, - 'node_class' => '\Assetic\Extension\Twig\AsseticFilterNode', - ))); + return new TwigFunction($name, function ($input, array $options) use ($extension, $name) { + return $extension->getFilterInvoker($name)->invoke($input, $options); + }, $options); } } diff --git a/src/Assetic/Extension/Twig/AsseticFilterNode.php b/src/Assetic/Extension/Twig/AsseticFilterNode.php deleted file mode 100644 index 8fa547d..0000000 --- a/src/Assetic/Extension/Twig/AsseticFilterNode.php +++ /dev/null @@ -1,11 +0,0 @@ -raw(sprintf('$this->env->getExtension(\'Assetic\\Extension\\Twig\\AsseticExtension\')->getFilterInvoker(\'%s\')->invoke', $this->getAttribute('name'))); - - $this->compileArguments($compiler); - } -} diff --git a/src/Assetic/Extension/Twig/TwigFormulaLoader.php b/src/Assetic/Extension/Twig/TwigFormulaLoader.php deleted file mode 100644 index eb733ff..0000000 --- a/src/Assetic/Extension/Twig/TwigFormulaLoader.php +++ /dev/null @@ -1,97 +0,0 @@ - - */ -class TwigFormulaLoader implements FormulaLoaderInterface -{ - private $twig; - private $logger; - - public function __construct(\Twig_Environment $twig, LoggerInterface $logger = null) - { - $this->twig = $twig; - $this->logger = $logger; - } - - public function load(ResourceInterface $resource) - { - try { - $tokens = $this->twig->tokenize(new \Twig_Source($resource->getContent(), (string) $resource)); - $nodes = $this->twig->parse($tokens); - } catch (\Exception $e) { - if ($this->logger) { - $this->logger->error(sprintf('The template "%s" contains an error: %s', $resource, $e->getMessage())); - } - - return array(); - } - - return $this->loadNode($nodes); - } - - /** - * Loads assets from the supplied node. - * - * @param \Twig_Node $node - * - * @return array An array of asset formulae indexed by name - */ - private function loadNode(\Twig_Node $node) - { - $formulae = array(); - - if ($node instanceof AsseticNode) { - $formulae[$node->getAttribute('name')] = array( - $node->getAttribute('inputs'), - $node->getAttribute('filters'), - array( - 'output' => $node->getAttribute('asset')->getTargetPath(), - 'name' => $node->getAttribute('name'), - 'debug' => $node->getAttribute('debug'), - 'combine' => $node->getAttribute('combine'), - 'vars' => $node->getAttribute('vars'), - ), - ); - } elseif ($node instanceof AsseticFilterNode) { - $name = $node->getAttribute('name'); - - $arguments = array(); - foreach ($node->getNode('arguments') as $argument) { - $arguments[] = eval('return '.$this->twig->compile($argument).';'); - } - - $invoker = $this->twig->getExtension('Assetic\Extension\Twig\AsseticExtension')->getFilterInvoker($name); - - $inputs = isset($arguments[0]) ? (array) $arguments[0] : array(); - $filters = $invoker->getFilters(); - $options = array_replace($invoker->getOptions(), isset($arguments[1]) ? $arguments[1] : array()); - - if (!isset($options['name'])) { - $options['name'] = $invoker->getFactory()->generateAssetName($inputs, $filters, $options); - } - - $formulae[$options['name']] = array($inputs, $filters, $options); - } - - foreach ($node as $child) { - if ($child instanceof \Twig_Node) { - $formulae += $this->loadNode($child); - } - } - - if ($node->hasAttribute('embedded_templates')) { - foreach ($node->getAttribute('embedded_templates') as $child) { - $formulae += $this->loadNode($child); - } - } - - return $formulae; - } -} diff --git a/tests/Assetic/Test/Extension/Twig/AsseticExtensionTest.php b/tests/Assetic/Test/Extension/Twig/AsseticExtensionTest.php index 88a31b9..0cfd492 100644 --- a/tests/Assetic/Test/Extension/Twig/AsseticExtensionTest.php +++ b/tests/Assetic/Test/Extension/Twig/AsseticExtensionTest.php @@ -9,6 +9,9 @@ use Assetic\Asset\FileAsset; use Assetic\FilterManager; use Assetic\AssetManager; +use Twig\Environment; +use Twig\Loader\FilesystemLoader; + class AsseticExtensionTest extends \PHPUnit_Framework_TestCase { @@ -28,7 +31,7 @@ class AsseticExtensionTest extends \PHPUnit_Framework_TestCase private $factory; /** - * @var \Twig_Environment + * @var Environment */ private $twig; @@ -39,7 +42,7 @@ class AsseticExtensionTest extends \PHPUnit_Framework_TestCase protected function setUp() { - if (!class_exists('Twig_Environment')) { + if (!class_exists('\Twig\Environment')) { $this->markTestSkipped('Twig is not installed.'); } @@ -52,7 +55,7 @@ protected function setUp() $this->factory->setAssetManager($this->am); $this->factory->setFilterManager($this->fm); - $this->twig = new \Twig_Environment(new \Twig_Loader_Filesystem(__DIR__.'/templates')); + $this->twig = new Environment(new FilesystemLoader(__DIR__.'/templates')); $this->twig->addExtension(new AsseticExtension($this->factory, array(), $this->valueSupplier)); } @@ -197,7 +200,7 @@ public function testFilterFunction() ->with('some_filter') ->will($this->returnValue($filter)); - $this->twig = new \Twig_Environment(new \Twig_Loader_Filesystem(__DIR__.'/templates')); + $this->twig = new Environment(new FilesystemLoader(__DIR__.'/templates')); $this->twig->addExtension(new AsseticExtension($this->factory, array( 'some_func' => array( 'filter' => 'some_filter', diff --git a/tests/Assetic/Test/Extension/Twig/TwigFormulaLoaderTest.php b/tests/Assetic/Test/Extension/Twig/TwigFormulaLoaderTest.php deleted file mode 100644 index 32d4cdd..0000000 --- a/tests/Assetic/Test/Extension/Twig/TwigFormulaLoaderTest.php +++ /dev/null @@ -1,135 +0,0 @@ -markTestSkipped('Twig is not installed.'); - } - - $this->am = $this->getMockBuilder(AssetManager::class)->getMock(); - $this->fm = $this->getMockBuilder(FilterManager::class)->getMock(); - - $factory = new AssetFactory(__DIR__.'/templates'); - $factory->setAssetManager($this->am); - $factory->setFilterManager($this->fm); - - $twig = new \Twig_Environment(new \Twig_Loader_Array(array())); - $twig->addExtension(new AsseticExtension($factory, array( - 'some_func' => array( - 'filter' => 'some_filter', - 'options' => array('output' => 'css/*.css'), - ), - ))); - - $this->loader = new TwigFormulaLoader($twig); - } - - protected function tearDown() - { - $this->am = null; - $this->fm = null; - } - - public function testMixture() - { - $asset = $this->getMockBuilder(AssetInterface::class)->getMock(); - - $expected = array( - 'mixture' => array( - array('foo', 'foo/*', '@foo'), - array(), - array( - 'output' => 'packed/mixture', - 'name' => 'mixture', - 'debug' => false, - 'combine' => null, - 'vars' => array(), - ), - ), - ); - - $resource = $this->getMockBuilder(ResourceInterface::class)->getMock(); - $resource->expects($this->once()) - ->method('getContent') - ->will($this->returnValue(file_get_contents(__DIR__.'/templates/mixture.twig'))); - $this->am->expects($this->any()) - ->method('get') - ->with('foo') - ->will($this->returnValue($asset)); - - $formulae = $this->loader->load($resource); - $this->assertEquals($expected, $formulae); - } - - public function testFunction() - { - $expected = array( - 'my_asset' => array( - array('path/to/asset'), - array('some_filter'), - array('output' => 'css/*.css', 'name' => 'my_asset'), - ), - ); - - $resource = $this->getMockBuilder(ResourceInterface::class)->getMock(); - $resource->expects($this->once()) - ->method('getContent') - ->will($this->returnValue(file_get_contents(__DIR__.'/templates/function.twig'))); - - $formulae = $this->loader->load($resource); - $this->assertEquals($expected, $formulae); - } - - public function testUnclosedTag() - { - $resource = $this->getMockBuilder(ResourceInterface::class)->getMock(); - $resource->expects($this->once()) - ->method('getContent') - ->will($this->returnValue(file_get_contents(__DIR__.'/templates/unclosed_tag.twig'))); - - $formulae = $this->loader->load($resource); - $this->assertEquals(array(), $formulae); - } - - public function testEmbeddedTemplate() - { - $expected = array( - 'image' => array( - array('images/foo.png'), - array(), - array( - 'name' => 'image', - 'debug' => true, - 'vars' => array(), - 'output' => 'images/foo.png', - 'combine' => false, - ), - ), - ); - - $resource = $this->getMockBuilder(ResourceInterface::class)->getMock(); - $resource->expects($this->once()) - ->method('getContent') - ->will($this->returnValue(file_get_contents(__DIR__.'/templates/embed.twig'))); - - $formulae = $this->loader->load($resource); - $this->assertEquals($expected, $formulae); - } -} diff --git a/tests/Assetic/Test/Extension/Twig/TwigResourceTest.php b/tests/Assetic/Test/Extension/Twig/TwigResourceTest.php index 566ac88..4eb04cb 100644 --- a/tests/Assetic/Test/Extension/Twig/TwigResourceTest.php +++ b/tests/Assetic/Test/Extension/Twig/TwigResourceTest.php @@ -18,7 +18,7 @@ public function testInvalidTemplateNameGetContent() $loader->willImplement('Twig_SourceContextLoaderInterface'); } - $loader->getSourceContext('asdf')->willThrow(new \Twig_Error_Loader('')); + $loader->getSourceContext('asdf')->willThrow(new \Twig\Error\LoaderError('')); $resource = new TwigResource($loader->reveal(), 'asdf'); $this->assertEquals('', $resource->getContent()); @@ -30,7 +30,7 @@ public function testInvalidTemplateNameIsFresh() $loader->expects($this->once()) ->method('isFresh') ->with('asdf', 1234) - ->will($this->throwException(new \Twig_Error_Loader(''))); + ->will($this->throwException(new \Twig\Error\LoaderError(''))); $resource = new TwigResource($loader, 'asdf'); $this->assertFalse($resource->isFresh(1234));