Jelajahi Sumber

[AsseticBundle] updated for latest assetic development

Kris Wallsmith 14 tahun lalu
induk
melakukan
d7ea92a0f6
29 mengubah file dengan 264 tambahan dan 397 penghapusan
  1. 1 1
      src/Symfony/Bundle/AsseticBundle/AsseticBundle.php
  2. 35 0
      src/Symfony/Bundle/AsseticBundle/CacheWarmer/AssetManagerCacheWarmer.php
  3. 0 58
      src/Symfony/Bundle/AsseticBundle/CacheWarmer/PhpTemplatingAssetsCacheWarmer.php
  4. 0 58
      src/Symfony/Bundle/AsseticBundle/CacheWarmer/TwigAssetsCacheWarmer.php
  5. 55 3
      src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php
  6. 22 0
      src/Symfony/Bundle/AsseticBundle/DependencyInjection/Compiler/AssetManagerPass.php
  7. 7 6
      src/Symfony/Bundle/AsseticBundle/DependencyInjection/Compiler/TemplatingPass.php
  8. 0 90
      src/Symfony/Bundle/AsseticBundle/Factory/AssetManager.php
  9. 48 0
      src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResource.php
  10. 43 0
      src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php
  11. 3 8
      src/Symfony/Bundle/AsseticBundle/FilterManager.php
  12. 14 1
      src/Symfony/Bundle/AsseticBundle/Resources/config/assetic.xml
  13. 1 2
      src/Symfony/Bundle/AsseticBundle/Resources/config/controller.xml
  14. 6 8
      src/Symfony/Bundle/AsseticBundle/Resources/config/templating_php.xml
  15. 7 7
      src/Symfony/Bundle/AsseticBundle/Resources/config/templating_twig.xml
  16. 3 1
      src/Symfony/Bundle/AsseticBundle/Routing/AsseticLoader.php
  17. 5 18
      src/Symfony/Bundle/AsseticBundle/Templating/FormulaLoader.php
  18. 0 69
      src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/TwigAssetsCacheWarmerTest.php
  19. 0 1
      src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/bundle/Resources/views/Parents/Children/child.html.twig
  20. 0 1
      src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/bundle/Resources/views/Parents/parent.html.twig
  21. 0 1
      src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/bundle/Resources/views/grandparent.html.twig
  22. 0 41
      src/Symfony/Bundle/AsseticBundle/Tests/Factory/AssetManagerTest.php
  23. 3 8
      src/Symfony/Bundle/AsseticBundle/Tests/FilterManagerTest.php
  24. 2 6
      src/Symfony/Bundle/AsseticBundle/Tests/FunctionalTest.php
  25. 1 1
      src/Symfony/Bundle/AsseticBundle/Tests/Kernel/config/config.yml
  26. 2 2
      src/Symfony/Bundle/AsseticBundle/Twig/DynamicNode.php
  27. 2 2
      src/Symfony/Bundle/AsseticBundle/Twig/DynamicTokenParser.php
  28. 2 2
      src/Symfony/Bundle/AsseticBundle/Twig/StaticNode.php
  29. 2 2
      src/Symfony/Bundle/AsseticBundle/Twig/StaticTokenParser.php

+ 1 - 1
src/Symfony/Bundle/AsseticBundle/AsseticBundle.php

@@ -28,8 +28,8 @@ class AsseticBundle extends Bundle
     {
         parent::build($container);
 
+        $container->addCompilerPass(new TemplatingPass());
         $container->addCompilerPass(new AssetManagerPass());
         $container->addCompilerPass(new FilterManagerPass());
-        $container->addCompilerPass(new TemplatingPass());
     }
 }

+ 35 - 0
src/Symfony/Bundle/AsseticBundle/CacheWarmer/AssetManagerCacheWarmer.php

@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony framework.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Symfony\Bundle\AsseticBundle\CacheWarmer;
+
+use Assetic\Factory\LazyAssetManager;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;
+
+class AssetManagerCacheWarmer extends CacheWarmer
+{
+    protected $am;
+
+    public function __construct(LazyAssetManager $am)
+    {
+        $this->am = $am;
+    }
+
+    public function warmUp($cacheDir)
+    {
+        $this->am->load();
+    }
+
+    public function isOptional()
+    {
+        return true;
+    }
+}

+ 0 - 58
src/Symfony/Bundle/AsseticBundle/CacheWarmer/PhpTemplatingAssetsCacheWarmer.php

@@ -1,58 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony framework.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Symfony\Bundle\AsseticBundle\CacheWarmer;
-
-use Symfony\Bundle\AsseticBundle\Templating\FormulaLoader;
-use Symfony\Component\Finder\Finder;
-use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;
-use Symfony\Component\HttpKernel\Kernel;
-
-class PhpTemplatingAssetsCacheWarmer extends CacheWarmer
-{
-    protected $kernel;
-    protected $loader;
-
-    public function __construct(Kernel $kernel, FormulaLoader $loader)
-    {
-        $this->kernel = $kernel;
-        $this->loader = $loader;
-    }
-
-    public function warmUp($cacheDir)
-    {
-        $formulae = array();
-        foreach ($this->kernel->getBundles() as $name => $bundle) {
-            if (is_dir($dir = $bundle->getPath().'/Resources/views/')) {
-                $finder = new Finder();
-                $finder->files()->name('*.php')->in($dir);
-                foreach ($finder as $file) {
-                    $formulae += $this->loader->load($name.':'.substr($file->getPath(), strlen($dir)).':'.$file->getBasename());
-                }
-            }
-        }
-
-        if (is_dir($dir = $this->kernel->getRootDir().'/views/')) {
-            $finder = new Finder();
-            $finder->files()->name('*.php')->in($dir);
-            foreach ($finder as $file) {
-                $formulae += $this->loader->load(':'.substr($file->getPath(), strlen($dir)).':'.$file->getBasename());
-            }
-        }
-
-        $this->writeCacheFile($cacheDir.'/assetic_php_templating_assets.php', '<?php return '.var_export($formulae, true).';');
-    }
-
-    public function isOptional()
-    {
-        return false;
-    }
-}

+ 0 - 58
src/Symfony/Bundle/AsseticBundle/CacheWarmer/TwigAssetsCacheWarmer.php

@@ -1,58 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony framework.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Symfony\Bundle\AsseticBundle\CacheWarmer;
-
-use Assetic\Extension\Twig\FormulaLoader;
-use Symfony\Component\Finder\Finder;
-use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;
-use Symfony\Component\HttpKernel\Kernel;
-
-class TwigAssetsCacheWarmer extends CacheWarmer
-{
-    protected $kernel;
-    protected $loader;
-
-    public function __construct(Kernel $kernel, FormulaLoader $loader)
-    {
-        $this->kernel = $kernel;
-        $this->loader = $loader;
-    }
-
-    public function warmUp($cacheDir)
-    {
-        $formulae = array();
-        foreach ($this->kernel->getBundles() as $name => $bundle) {
-            if (is_dir($dir = $bundle->getPath().'/Resources/views/')) {
-                $finder = new Finder();
-                $finder->files()->name('*.twig')->in($dir)->sortByName();
-                foreach ($finder as $file) {
-                    $formulae += $this->loader->load($name.':'.substr($file->getPath(), strlen($dir)).':'.$file->getBasename());
-                }
-            }
-        }
-
-        if (is_dir($dir = $this->kernel->getRootDir().'/views/')) {
-            $finder = new Finder();
-            $finder->files()->name('*.twig')->in($dir);
-            foreach ($finder as $file) {
-                $formulae += $this->loader->load(':'.substr($file->getPath(), strlen($dir)).':'.$file->getBasename());
-            }
-        }
-
-        $this->writeCacheFile($cacheDir.'/assetic_twig_assets.php', '<?php return '.var_export($formulae, true).';');
-    }
-
-    public function isOptional()
-    {
-        return false;
-    }
-}

+ 55 - 3
src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php

@@ -11,11 +11,13 @@
 
 namespace Symfony\Bundle\AsseticBundle\DependencyInjection;
 
-use Symfony\Component\HttpKernel\DependencyInjection\Extension;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\Config\FileLocator;
 use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 
 /**
  * Semantic asset configuration.
@@ -94,6 +96,56 @@ class AsseticExtension extends Extension
         if ($container->hasParameter('assetic.less.compress')) {
             $container->getDefinition('assetic.filter.less')->addMethodCall('setCompress', array('%assetic.less.compress%'));
         }
+
+        $this->registerFormulaResources($container);
+    }
+
+    protected function registerFormulaResources(ContainerBuilder $container)
+    {
+        // bundle views/ directories
+        $am = $container->getDefinition('assetic.asset_manager');
+        foreach ($container->getParameter('kernel.bundles') as $name => $class) {
+            $rc = new \ReflectionClass($class);
+            if (is_dir($dir = dirname($rc->getFileName()).'/Resources/views')) {
+                foreach (array('twig', 'php') as $engine) {
+                    $container->setDefinition(
+                        'assetic.'.$engine.'_directory_resource.'.$name,
+                        $this->createDirectoryResourceDefinition($name, $dir, $engine)
+                    );
+                }
+            }
+        }
+
+        // kernel views/ directory
+        if (is_dir($dir = $container->getParameter('kernel.root_dir').'/views')) {
+            foreach (array('twig', 'php') as $engine) {
+                $container->setDefinition(
+                    'assetic.'.$engine.'_directory_resource.kernel',
+                    $this->createDirectoryResourceDefinition('', $dir, $engine)
+                );
+            }
+        }
+    }
+
+    /**
+     * @todo decorate an abstract xml definition
+     */
+    protected function createDirectoryResourceDefinition($bundle, $dir, $engine)
+    {
+        $definition = new Definition('%assetic.directory_resource.class%');
+
+        $definition
+            ->addArgument(new Reference('templating.name_parser'))
+            ->addArgument(new Reference('templating.loader'))
+            ->addArgument($bundle)
+            ->addArgument($dir)
+            ->addArgument('/\.'.$engine.'$/')
+            ->addTag('assetic.templating.'.$engine)
+            ->addTag('assetic.formula_resource', array('loader' => $engine))
+            ->setPublic(false)
+        ;
+
+        return $definition;
     }
 
     /**

+ 22 - 0
src/Symfony/Bundle/AsseticBundle/DependencyInjection/Compiler/AssetManagerPass.php

@@ -29,6 +29,8 @@ class AssetManagerPass implements CompilerPassInterface
         }
 
         $am = $container->getDefinition('assetic.asset_manager');
+
+        // add assets
         foreach ($container->findTaggedServiceIds('assetic.asset') as $id => $attributes) {
             foreach ($attributes as $attr) {
                 if (isset($attr['alias'])) {
@@ -36,5 +38,25 @@ class AssetManagerPass implements CompilerPassInterface
                 }
             }
         }
+
+        // add loaders
+        $loaders = array();
+        foreach ($container->findTaggedServiceIds('assetic.formula_loader') as $id => $attributes) {
+            foreach ($attributes as $attr) {
+                if (isset($attr['alias'])) {
+                    $loaders[$attr['alias']] = new Reference($id);
+                }
+            }
+        }
+        $am->setArgument(1, $loaders);
+
+        // add resources
+        foreach ($container->findTaggedServiceIds('assetic.formula_resource') as $id => $attributes) {
+            foreach ($attributes as $attr) {
+                if (isset($attr['loader'])) {
+                    $am->addMethodCall('addResource', array($attr['loader'], new Reference($id)));
+                }
+            }
+        }
     }
 }

+ 7 - 6
src/Symfony/Bundle/AsseticBundle/DependencyInjection/Compiler/TemplatingPass.php

@@ -14,6 +14,11 @@ namespace Symfony\Bundle\AsseticBundle\DependencyInjection\Compiler;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
 
+/**
+ * This pass removes services associated with unused templating engines.
+ *
+ * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
+ */
 class TemplatingPass implements CompilerPassInterface
 {
     public function process(ContainerBuilder $container)
@@ -25,17 +30,13 @@ class TemplatingPass implements CompilerPassInterface
         $am = $container->getDefinition('assetic.asset_manager');
         $engines = $container->getParameterBag()->resolveValue($container->getParameter('templating.engines'));
 
-        if (in_array('twig', $engines)) {
-            $am->addMethodCall('addCacheFile', array('%kernel.cache_dir%/assetic_twig_assets.php'));
-        } else {
+        if (!in_array('twig', $engines)) {
             foreach ($container->findTaggedServiceIds('assetic.templating.twig') as $id => $attr) {
                 $container->remove($id);
             }
         }
 
-        if (in_array('php', $engines)) {
-            // $am->addMethodCall('addCacheFile', array('%kernel.cache_dir%/assetic_php_assets.php'));
-        } else {
+        if (!in_array('php', $engines)) {
             foreach ($container->findTaggedServiceIds('assetic.templating.php') as $id => $attr) {
                 $container->remove($id);
             }

+ 0 - 90
src/Symfony/Bundle/AsseticBundle/Factory/AssetManager.php

@@ -1,90 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony framework.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Symfony\Bundle\AsseticBundle\Factory;
-
-use Assetic\Factory\LazyAssetManager;
-
-/**
- * Loads asset formulae from the filesystem.
- *
- * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
- */
-class AssetManager extends LazyAssetManager
-{
-    protected $cacheFiles = array();
-    protected $fresh = true;
-
-    /**
-     * Adds a cache file.
-     *
-     * Files added will be lazily loaded once needed.
-     *
-     * @param string $file A file that returns an array of formulae
-     */
-    public function addCacheFile($file)
-    {
-        $this->cacheFiles[] = $file;
-        $this->fresh = false;
-    }
-
-    public function getFormulae()
-    {
-        if (!$this->fresh) {
-            $this->loadCacheFiles();
-        }
-
-        return $this->formulae;
-    }
-
-    public function get($name)
-    {
-        if (!$this->fresh) {
-            $this->loadCacheFiles();
-        }
-
-        return parent::get($name);
-    }
-
-    public function has($name)
-    {
-        if (!$this->fresh) {
-            $this->loadCacheFiles();
-        }
-
-        return parent::has($name);
-    }
-
-    public function all()
-    {
-        if (!$this->fresh) {
-            $this->loadCacheFiles();
-        }
-
-        return parent::all();
-    }
-
-    /**
-     * Loads formulae from the cache files.
-     */
-    protected function loadCacheFiles()
-    {
-        while ($file = array_shift($this->cacheFiles)) {
-            if (!file_exists($file)) {
-                throw new \RuntimeException('The asset manager cache has not been warmed.');
-            }
-
-            $this->addFormulae(require $file);
-        }
-
-        $this->fresh = true;
-    }
-}

+ 48 - 0
src/Symfony/Bundle/AsseticBundle/Factory/DirectoryResource.php

@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony framework.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Symfony\Bundle\AsseticBundle\Factory;
+
+use Assetic\Factory\Resource\DirectoryResource as BaseDirectoryResource;
+use Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser;
+use Symfony\Component\Templating\Loader\LoaderInterface;
+
+/**
+ * A directory resource that creates Symfony2 resources.
+ *
+ * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
+ */
+class DirectoryResource extends BaseDirectoryResource
+{
+    protected $parser;
+    protected $loader;
+    protected $bundle;
+    protected $baseDirLength;
+
+    public function __construct(TemplateNameParser $parser, LoaderInterface $loader, $bundle, $baseDir, $pattern = null)
+    {
+        $this->parser = $parser;
+        $this->loader = $loader;
+        $this->bundle = $bundle;
+
+        $this->baseDirLength = strlen(rtrim($baseDir, '/')) + 1;
+
+        parent::__construct($baseDir, $pattern);
+    }
+
+    protected function createResource($path)
+    {
+        $template = $this->parser->parseFromFilename(substr($path, $this->baseDirLength));
+        $template->set('bundle', $this->bundle);
+
+        return new FileResource($this->loader, $template);
+    }
+}

+ 43 - 0
src/Symfony/Bundle/AsseticBundle/Factory/FileResource.php

@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony framework.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Symfony\Bundle\AsseticBundle\Factory;
+
+use Assetic\Factory\Resource\ResourceInterface;
+use Symfony\Component\Templating\Loader\LoaderInterface;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * A file resource.
+ *
+ * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
+ */
+class FileResource implements ResourceInterface
+{
+    protected $loader;
+    protected $template;
+
+    public function __construct(LoaderInterface $loader, TemplateReferenceInterface $template)
+    {
+        $this->loader = $loader;
+        $this->template = $template;
+    }
+
+    public function isFresh($timestamp)
+    {
+        return $this->loader->isFresh($this->template, $timestamp);
+    }
+
+    public function getContent()
+    {
+        return $this->loader->load($this->template)->getContent();
+    }
+}

+ 3 - 8
src/Symfony/Bundle/AsseticBundle/FilterManager.php

@@ -45,16 +45,11 @@ class FilterManager extends BaseFilterManager
 
     public function has($name)
     {
-        return isset($this->mappings) || parent::has($name);
+        return isset($this->mappings[$name]) || parent::has($name);
     }
 
-    public function all()
+    public function getNames()
     {
-        $filters = array();
-        foreach ($this->mappings as $name => $id) {
-            $filters[$name] = $this->container->get($id);
-        }
-
-        return $filters + parent::all();
+        return array_unique(array_merge(array_keys($this->mappings), parent::getNames()));
     }
 }

+ 14 - 1
src/Symfony/Bundle/AsseticBundle/Resources/config/assetic.xml

@@ -6,8 +6,12 @@
 
     <parameters>
         <parameter key="assetic.asset_factory.class">Symfony\Bundle\AsseticBundle\Factory\AssetFactory</parameter>
-        <parameter key="assetic.asset_manager.class">Symfony\Bundle\AsseticBundle\Factory\AssetManager</parameter>
+        <parameter key="assetic.asset_manager.class">Assetic\Factory\LazyAssetManager</parameter>
         <parameter key="assetic.filter_manager.class">Symfony\Bundle\AsseticBundle\FilterManager</parameter>
+        <parameter key="assetic.cached_formula_loader.class">Assetic\Factory\Loader\CachedFormulaLoader</parameter>
+        <parameter key="assetic.config_cache.class">Assetic\Cache\ConfigCache</parameter>
+        <parameter key="assetic.asset_manager_cache_warmer.class">Symfony\Bundle\AsseticBundle\CacheWarmer\AssetManagerCacheWarmer</parameter>
+        <parameter key="assetic.directory_resource.class">Symfony\Bundle\AsseticBundle\Factory\DirectoryResource</parameter>
 
         <parameter key="assetic.filter.coffee.class">Assetic\Filter\CoffeeScriptFilter</parameter>
         <parameter key="assetic.filter.cssrewrite.class">Assetic\Filter\CssRewriteFilter</parameter>
@@ -24,6 +28,8 @@
         <parameter key="assetic.node_paths" type="collection"></parameter>
         <parameter key="assetic.sprocketize_bin">/usr/bin/sprocketize</parameter>
         <parameter key="assetic.coffee_bin">/usr/bin/coffee</parameter>
+
+        <parameter key="assetic.cache_dir">%kernel.cache_dir%/assetic</parameter>
     </parameters>
 
     <services>
@@ -34,6 +40,7 @@
         </service>
         <service id="assetic.asset_manager" class="%assetic.asset_manager.class%">
             <argument type="service" id="assetic.asset_factory" />
+            <argument type="collection"></argument>
         </service>
         <service id="assetic.asset_factory" class="%assetic.asset_factory.class%" public="false">
             <argument type="service" id="kernel" />
@@ -79,5 +86,11 @@
         <service id="assetic.css_tokenizer" class="PHP_CodeSniffer_Tokenizers_CSS" public="false">
             <file>PHP/CodeSniffer.php</file>
         </service>
+        <service id="assetic.config_cache" class="%assetic.config_cache.class%" public="false">
+            <argument>%assetic.cache_dir%/config</argument>
+        </service>
+        <service id="assetic.asset_manager_cache_warmer" class="%assetic.asset_manager_cache_warmer.class%" public="false">
+            <tag name="kernel.cache_warmer" priority="10" />
+        </service>
     </services>
 </container>

+ 1 - 2
src/Symfony/Bundle/AsseticBundle/Resources/config/controller.xml

@@ -8,7 +8,6 @@
         <parameter key="assetic.controller.class">Symfony\Bundle\AsseticBundle\Controller\AsseticController</parameter>
         <parameter key="assetic.routing_loader.class">Symfony\Bundle\AsseticBundle\Routing\AsseticLoader</parameter>
         <parameter key="assetic.cache.class">Assetic\Cache\FilesystemCache</parameter>
-        <parameter key="assetic.cache_dir">%kernel.cache_dir%/assetic</parameter>
     </parameters>
 
     <services>
@@ -22,7 +21,7 @@
             <argument type="service" id="assetic.cache" />
         </service>
         <service id="assetic.cache" class="%assetic.cache.class%" public="false">
-            <argument>%assetic.cache_dir%</argument>
+            <argument>%assetic.cache_dir%/assets</argument>
         </service>
     </services>
 </container>

+ 6 - 8
src/Symfony/Bundle/AsseticBundle/Resources/config/templating_php.xml

@@ -6,8 +6,8 @@
 
     <parameters>
         <parameter key="assetic.helper.class">Symfony\Bundle\AsseticBundle\Templating\AsseticHelper</parameter>
-        <parameter key="assetic.cache_warmer.php.class">Symfony\Bundle\AsseticBundle\CacheWarmer\PhpTemplatingAssetsCacheWarmer</parameter>
         <parameter key="assetic.php_formula_loader.class">Symfony\Bundle\AsseticBundle\Templating\FormulaLoader</parameter>
+        <parameter key="assetic.php_directory_resource.class"></parameter>
     </parameters>
 
     <services>
@@ -19,16 +19,14 @@
             <argument>%assetic.default_javascripts_output%</argument>
             <argument>%assetic.default_stylesheets_output%</argument>
         </service>
-        <service id="assetic.cache_warmer.php" class="%assetic.cache_warmer.php.class%" public="false">
-            <tag name="kernel.cache_warmer" priority="10" />
+        <service id="assetic.php_formula_loader" class="%assetic.cached_formula_loader.class%" public="false">
+            <tag name="assetic.formula_loader" alias="php" />
             <tag name="assetic.templating.php" />
-            <argument type="service" id="kernel" />
-            <argument type="service" id="assetic.php_formula_loader" />
+            <argument type="service" id="assetic.php_formula_loader.real" />
+            <argument type="service" id="assetic.config_cache" />
         </service>
-        <service id="assetic.php_formula_loader" class="%assetic.php_formula_loader.class%" public="false">
+        <service id="assetic.php_formula_loader.real" class="%assetic.php_formula_loader.class%" public="false">
             <tag name="assetic.templating.php" />
-            <argument type="service" id="templating.name_parser" />
-            <argument type="service" id="templating.loader" />
         </service>
     </services>
 </container>

+ 7 - 7
src/Symfony/Bundle/AsseticBundle/Resources/config/templating_twig.xml

@@ -7,8 +7,8 @@
     <parameters>
         <parameter key="assetic.twig_extension.dynamic.class">Symfony\Bundle\AsseticBundle\Twig\DynamicExtension</parameter>
         <parameter key="assetic.twig_extension.static.class">Symfony\Bundle\AsseticBundle\Twig\StaticExtension</parameter>
-        <parameter key="assetic.twig_formula_loader.class">Assetic\Extension\Twig\FormulaLoader</parameter>
-        <parameter key="assetic.cache_warmer.twig.class">Symfony\Bundle\AsseticBundle\CacheWarmer\TwigAssetsCacheWarmer</parameter>
+        <parameter key="assetic.twig_formula_loader.class">Assetic\Extension\Twig\TwigFormulaLoader</parameter>
+        <parameter key="assetic.twig_directory_resource.class"></parameter>
     </parameters>
 
     <services>
@@ -20,13 +20,13 @@
             <argument>%assetic.default_javascripts_output%</argument>
             <argument>%assetic.default_stylesheets_output%</argument>
         </service>
-        <service id="assetic.cache_warmer.twig" class="%assetic.cache_warmer.twig.class%" public="false">
-            <tag name="kernel.cache_warmer" priority="10" />
+        <service id="assetic.twig_formula_loader" class="%assetic.cached_formula_loader.class%" public="false">
+            <tag name="assetic.formula_loader" alias="twig" />
             <tag name="assetic.templating.twig" />
-            <argument type="service" id="kernel" />
-            <argument type="service" id="assetic.twig_formula_loader" />
+            <argument type="service" id="assetic.twig_formula_loader.real" />
+            <argument type="service" id="assetic.config_cache" />
         </service>
-        <service id="assetic.twig_formula_loader" class="%assetic.twig_formula_loader.class%" public="false">
+        <service id="assetic.twig_formula_loader.real" class="%assetic.twig_formula_loader.class%" public="false">
             <tag name="assetic.templating.twig" />
             <argument type="service" id="twig" />
         </service>

+ 3 - 1
src/Symfony/Bundle/AsseticBundle/Routing/AsseticLoader.php

@@ -45,7 +45,9 @@ class AsseticLoader extends Loader
     public function load($resource, $type = null)
     {
         $routes = new RouteCollection();
-        foreach ($this->am->all() as $name => $asset) {
+        foreach ($this->am->getNames() as $name) {
+            $asset = $this->am->get($name);
+
             $defaults = array(
                 '_controller' => 'assetic.controller:render',
                 'name'        => $name,

+ 5 - 18
src/Symfony/Bundle/AsseticBundle/Templating/FormulaLoader.php

@@ -11,32 +11,19 @@
 
 namespace Symfony\Bundle\AsseticBundle\Templating;
 
-use Symfony\Component\Templating\Loader\LoaderInterface;
-use Symfony\Component\Templating\TemplateNameParser;
+use Assetic\Factory\Loader\FormulaLoaderInterface;
+use Assetic\Factory\Resource\ResourceInterface;
 
 /**
  * Loads formulae from PHP templates.
  *
  * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
  */
-class FormulaLoader
+class FormulaLoader implements FormulaLoaderInterface
 {
-    protected $parser;
-    protected $loader;
-
-    public function __construct(TemplateNameParser $parser, LoaderInterface $loader)
+    public function load(ResourceInterface $resource)
     {
-        $this->parser = $parser;
-        $this->loader = $loader;
-    }
-
-    public function load($templateName)
-    {
-        if (!$template = $this->loader->load($this->parser->parse($templateName))) {
-            return array();
-        }
-
-        $tokens = token_get_all($template->getContent());
+        $tokens = token_get_all($resource->getContent());
 
         /**
          * @todo Find and extract asset formulae from calls to the following:

+ 0 - 69
src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/TwigAssetsCacheWarmerTest.php

@@ -1,69 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony framework.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Symfony\Bundle\AsseticBundle\Tests\CacheWarmer;
-
-use Symfony\Bundle\AsseticBundle\CacheWarmer\TwigAssetsCacheWarmer;
-
-class TwigAssetsCacheWarmerTest extends \PHPUnit_Framework_TestCase
-{
-    protected function setUp()
-    {
-        if (!class_exists('Assetic\\AssetManager')) {
-            $this->markTestSkipped('Assetic is not available.');
-        }
-
-        $this->kernel = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Kernel')
-            ->disableOriginalConstructor()
-            ->setMethods(array('registerRootDir', 'registerBundles', 'registerContainerConfiguration', 'getBundles'))
-            ->getMock();
-        $this->loader = $this->getMockBuilder('Assetic\\Extension\\Twig\\FormulaLoader')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->cacheWarmer = new TwigAssetsCacheWarmer($this->kernel, $this->loader);
-
-        // cache dir
-        $this->cacheDir = sys_get_temp_dir();
-        @unlink($this->cacheDir.'/twig_assets.php');
-    }
-
-    protected function tearDown()
-    {
-        @unlink($this->cacheDir.'/twig_assets.php');
-    }
-
-    public function testCacheWarmer()
-    {
-        $bundle = $this->getMock('Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface');
-
-        $this->kernel->expects($this->once())
-            ->method('getBundles')
-            ->will($this->returnValue(array('MyBundle' => $bundle)));
-        $bundle->expects($this->once())
-            ->method('getPath')
-            ->will($this->returnValue(strtr(__DIR__.'/bundle', '\\', '/')));
-        $this->loader->expects($this->at(0))
-            ->method('load')
-            ->with('MyBundle:Parents/Children:child.html.twig')
-            ->will($this->returnValue(array('child' => array())));
-        $this->loader->expects($this->at(1))
-            ->method('load')
-            ->with('MyBundle:Parents:parent.html.twig')
-            ->will($this->returnValue(array('parent' => array())));
-        $this->loader->expects($this->at(2))
-            ->method('load')
-            ->with('MyBundle::grandparent.html.twig')
-            ->will($this->returnValue(array('grandparent' => array())));
-
-        $this->cacheWarmer->warmUp($this->cacheDir);
-    }
-}

+ 0 - 1
src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/bundle/Resources/views/Parents/Children/child.html.twig

@@ -1 +0,0 @@
-{# empty #}

+ 0 - 1
src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/bundle/Resources/views/Parents/parent.html.twig

@@ -1 +0,0 @@
-{# empty #}

+ 0 - 1
src/Symfony/Bundle/AsseticBundle/Tests/CacheWarmer/bundle/Resources/views/grandparent.html.twig

@@ -1 +0,0 @@
-{# empty #}

+ 0 - 41
src/Symfony/Bundle/AsseticBundle/Tests/Factory/AssetManagerTest.php

@@ -1,41 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony framework.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Symfony\Bundle\AsseticBundle\Tests\Factory;
-
-use Symfony\Bundle\AsseticBundle\Factory\AssetManager;
-
-class AssetManagerTest extends \PHPUnit_Framework_TestCase
-{
-    protected function setUp()
-    {
-        if (!class_exists('Assetic\\AssetManager')) {
-            $this->markTestSkipped('Assetic is not available.');
-        }
-    }
-
-    public function testLoadFormulae()
-    {
-        $file = tempnam(sys_get_temp_dir(), 'assetic');
-        file_put_contents($file, '<?php return array(\'foo\' => array());');
-
-        $factory = $this->getMockBuilder('Assetic\\Factory\\AssetFactory')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $am = new AssetManager($factory);
-        $am->addCacheFile($file);
-
-        $this->assertTrue($am->has('foo'), '->loadFormulae() loads formulae');
-
-        unlink($file);
-    }
-}

+ 3 - 8
src/Symfony/Bundle/AsseticBundle/Tests/FilterManagerTest.php

@@ -46,19 +46,14 @@ class FilterManagerTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($fm->has('foo'), '->has() returns true for lazily mapped filters');
     }
 
-    public function testAll()
+    public function testGetNames()
     {
         $container = $this->getMock('Symfony\\Component\\DependencyInjection\\ContainerInterface');
         $filter = $this->getMock('Assetic\\Filter\\FilterInterface');
 
-        $container->expects($this->once())
-            ->method('get')
-            ->with('assetic.filter.bar')
-            ->will($this->returnValue($filter));
-
         $fm = new FilterManager($container, array('foo' => 'assetic.filter.bar'));
         $fm->set('bar', $filter);
-        $all = $fm->all();
-        $this->assertEquals(2, count($all), '->all() returns all lazy and normal filters');
+
+        $this->assertEquals(array('foo', 'bar'), $fm->getNames(), '->getNames() returns all lazy and normal filter names');
     }
 }

+ 2 - 6
src/Symfony/Bundle/AsseticBundle/Tests/FunctionalTest.php

@@ -44,11 +44,10 @@ class FunctionalTest extends \PHPUnit_Framework_TestCase
         $kernel = new TestKernel('test', $debug);
         $kernel->boot();
         $container = $kernel->getContainer();
-        $container->get('cache_warmer')->warmUp($container->getParameter('kernel.cache_dir'));
 
-        $assets = $container->get('assetic.asset_manager')->all();
+        $names = $container->get('assetic.asset_manager')->getNames();
 
-        $this->assertEquals($count, count($assets));
+        $this->assertEquals($count, count($names));
     }
 
     /**
@@ -59,7 +58,6 @@ class FunctionalTest extends \PHPUnit_Framework_TestCase
         $kernel = new TestKernel('test', $debug);
         $kernel->boot();
         $container = $kernel->getContainer();
-        $container->get('cache_warmer')->warmUp($container->getParameter('kernel.cache_dir'));
 
         $routes = $container->get('router')->getRouteCollection()->all();
 
@@ -80,7 +78,6 @@ class FunctionalTest extends \PHPUnit_Framework_TestCase
         $container = $kernel->getContainer();
         $container->enterScope('request');
         $container->set('request', new Request());
-        $container->get('cache_warmer')->warmUp($container->getParameter('kernel.cache_dir'));
 
         $content = $container->get('templating')->render('::layout.html.twig');
         $crawler = new Crawler($content);
@@ -98,7 +95,6 @@ class FunctionalTest extends \PHPUnit_Framework_TestCase
         $container = $kernel->getContainer();
         $container->enterScope('request');
         $container->set('request', new Request());
-        $container->get('cache_warmer')->warmUp($container->getParameter('kernel.cache_dir'));
 
         $content = $container->get('templating')->render('::layout.html.php');
         $crawler = new Crawler($content);

+ 1 - 1
src/Symfony/Bundle/AsseticBundle/Tests/Kernel/config/config.yml

@@ -6,7 +6,7 @@ framework:
         secret: xxxxxxxxxx
     router:        { resource: "%kernel.root_dir%/config/routing.yml" }
     validation:    { enabled: true, annotations: true }
-    templating:    { engines: ['twig', 'php'] }
+    templating:    { engines: ['twig'] }
     session:
         default_locale: en
         lifetime:       3600

+ 2 - 2
src/Symfony/Bundle/AsseticBundle/Twig/DynamicNode.php

@@ -11,14 +11,14 @@
 
 namespace Symfony\Bundle\AsseticBundle\Twig;
 
-use Assetic\Extension\Twig\Node;
+use Assetic\Extension\Twig\AsseticNode;
 
 /**
  * The "dynamic" node uses a controller to render assets.
  *
  * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
  */
-class DynamicNode extends Node
+class DynamicNode extends AsseticNode
 {
     /**
      * Renders the asset URL using Symfony's path() function.

+ 2 - 2
src/Symfony/Bundle/AsseticBundle/Twig/DynamicTokenParser.php

@@ -11,14 +11,14 @@
 
 namespace Symfony\Bundle\AsseticBundle\Twig;
 
-use Assetic\Extension\Twig\TokenParser;
+use Assetic\Extension\Twig\AsseticTokenParser;
 
 /**
  * Parses the {% assets %} tag.
  *
  * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
  */
-class DynamicTokenParser extends TokenParser
+class DynamicTokenParser extends AsseticTokenParser
 {
     static protected function createNode(\Twig_NodeInterface $body, array $sourceUrls, $targetUrl, array $filterNames, $assetName, $debug = false, $lineno = 0, $tag = null)
     {

+ 2 - 2
src/Symfony/Bundle/AsseticBundle/Twig/StaticNode.php

@@ -11,14 +11,14 @@
 
 namespace Symfony\Bundle\AsseticBundle\Twig;
 
-use Assetic\Extension\Twig\Node;
+use Assetic\Extension\Twig\AsseticNode;
 
 /**
  * The "static" node references a file in the web directory.
  *
  * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
  */
-class StaticNode extends Node
+class StaticNode extends AsseticNode
 {
     /**
      * Renders the asset URL using Symfony's asset() function.

+ 2 - 2
src/Symfony/Bundle/AsseticBundle/Twig/StaticTokenParser.php

@@ -11,14 +11,14 @@
 
 namespace Symfony\Bundle\AsseticBundle\Twig;
 
-use Assetic\Extension\Twig\TokenParser;
+use Assetic\Extension\Twig\AsseticTokenParser;
 
 /**
  * Parses the {% assets %} tag.
  *
  * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
  */
-class StaticTokenParser extends TokenParser
+class StaticTokenParser extends AsseticTokenParser
 {
     static protected function createNode(\Twig_NodeInterface $body, array $sourceUrls, $targetUrl, array $filterNames, $assetName, $debug = false, $lineno = 0, $tag = null)
     {