• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tito10047 / progressive-image-bundle / 20661725623

02 Jan 2026 04:11PM UTC coverage: 89.065%. Remained the same
20661725623

push

github

tito10047
replace `grid` with `sizes`: update all references in templates, tests, and documentation to align with the new attribute name; adjust `Image` component logic accordingly and ensure backward compatibility

1 of 1 new or added line in 1 file covered. (100.0%)

111 existing lines in 9 files now uncovered.

562 of 631 relevant lines covered (89.06%)

166.02 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.17
/src/DependencyInjection/ProgressiveImageExtension.php
1
<?php
2

3
namespace Tito10047\ProgressiveImageBundle\DependencyInjection;
4

5
use Symfony\Component\Config\FileLocator;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Extension\Extension;
8
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
9
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
10
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
11
use Symfony\Component\DependencyInjection\Reference;
12
use Symfony\Contracts\Cache\CacheInterface;
13
use Tito10047\ProgressiveImageBundle\Resolver\AssetMapperResolver;
14
use Tito10047\ProgressiveImageBundle\Resolver\FileSystemResolver;
15
use Tito10047\ProgressiveImageBundle\Service\MetadataReader;
16
use Tito10047\ProgressiveImageBundle\Service\PreloadCollector;
17
use Tito10047\ProgressiveImageBundle\Service\ResponsiveAttributeGenerator;
18
use Tito10047\ProgressiveImageBundle\Twig\TransparentCacheExtension;
19
use Tito10047\ProgressiveImageBundle\Event\TransparentImageCacheSubscriber;
20
use Tito10047\ProgressiveImageBundle\Twig\Components\Image;
21
use Tito10047\ProgressiveImageBundle\UrlGenerator\ResponsiveImageUrlGeneratorInterface;
22
use function Symfony\Component\DependencyInjection\Loader\Configurator\service;
23

24
class ProgressiveImageExtension extends Extension implements PrependExtensionInterface {
25

26
    public function getAlias(): string
27
    {
28
        return 'progressive_image';
317✔
29
    }
30

31
        public function prepend(ContainerBuilder $builder): void
32
        {
33
                $builder->prependExtensionConfig('framework', [
317✔
34
                        'asset_mapper' => [
317✔
35
                                'paths' => [
317✔
36
                                        __DIR__.'/../../assets' => 'tito10047/progressive-image-bundle',
317✔
37
                                ],
317✔
38
                        ],
317✔
39
                ]);
317✔
40
                $builder->prependExtensionConfig('twig_component', [
317✔
41
                        'defaults' => [
317✔
42
                                'Tito10047\ProgressiveImageBundle\Twig\Components\\' => [
317✔
43
                                        'template_directory' => '@ProgressiveImage/components/',
317✔
44
                                        'name_prefix' => 'pgi',
317✔
45
                                ],
317✔
46
                        ],
317✔
47
                ]);
317✔
48

49
                $configs = $builder->getExtensionConfig($this->getAlias());
317✔
50
                $configs = $this->processConfiguration(new Configuration(), $configs);
317✔
51

52
                if (isset($configs['responsive_strategy']['breakpoints'])) {
317✔
53
                        $breakpoints = $configs['responsive_strategy']['breakpoints'];
×
54
                        $liipConfigs = $builder->getExtensionConfig('liip_imagine');
×
55

56
                        $newFilterSets = [];
×
57
                        foreach ($liipConfigs as $liipConfig) {
×
58
                                if (isset($liipConfig['filter_sets'])) {
×
59
                                        foreach ($liipConfig['filter_sets'] as $setName => $setConfig) {
×
60
                                                foreach ($breakpoints as $breakpointName => $width) {
×
61
                                                        $newSetName = $setName . '_' . $breakpointName;
×
62
                                                        if (isset($newFilterSets[$newSetName])) {
×
63
                                                                continue;
×
64
                                                        }
65
                                                        $newSetConfig = $setConfig;
×
66

67
                                                        if (isset($newSetConfig['filters']['thumbnail']['size'])) {
×
68
                                                                [$origWidth, $origHeight] = $newSetConfig['filters']['thumbnail']['size'];
×
69
                                                                if ($origWidth > 0 && $origHeight > 0) {
×
70
                                                                        $ratio = $origHeight / $origWidth;
×
71
                                                                        $newHeight = (int) round($width * $ratio);
×
72
                                                                        $newSetConfig['filters']['thumbnail']['size'] = [$width, $newHeight];
×
73
                                                                } else {
74
                                                                        $newSetConfig['filters']['thumbnail']['size'] = [$width, $width];
×
75
                                                                }
76
                                                        }
77

78
                                                        $newFilterSets[$newSetName] = $newSetConfig;
×
79
                                                }
80
                                        }
81
                                }
82
                        }
83

84
                        if (!empty($newFilterSets)) {
×
85
                                $builder->prependExtensionConfig('liip_imagine', [
×
86
                                        'filter_sets' => $newFilterSets,
×
87
                                ]);
×
88
                        }
89
                }
90
        }
91

92

93

94
        public function load(array $configs, ContainerBuilder $container): void {
95

96
                $configs = $this->processConfiguration(new Configuration(), $configs);
317✔
97

98
                if (!isset($container->getParameter('kernel.bundles')['TwigBundle'])) {
317✔
99
                        throw new \LogicException('The TwigBundle is not registered in your application. Try running "composer require symfony/twig-bundle".');
×
100
                }
101

102
                $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../config'));
317✔
103
                $loader->load('services.php');
317✔
104

105
                $this->configureResolvers($configs, $container);
317✔
106

107
                $driver = $configs['driver'] ?? 'gd';
317✔
108
                $analyzerId = match ($driver) {
317✔
109
                        "imagick" => "progressive_image.analyzer.imagick",
×
110
                        "gd" => "progressive_image.analyzer.gd",
317✔
111
                        default => $driver,
×
112
                };
317✔
113

114
                $resolver   = $configs['resolver']??'default';
317✔
115
                $maybeService = 'progressive_image.resolver.' . $resolver;
317✔
116
                if ($container->hasDefinition($maybeService)) {
317✔
117
                        $resolverId = $maybeService;
317✔
118
                }else{
119
                        $resolverId = $resolver;
×
120
                }
121
                $loaderId = $configs['loader']??'progressive_image.filesystem.loader';
317✔
122
                $cacheId = $configs['cache']??'cache.app';
317✔
123
                $imageCacheServiceId = $configs['image_cache_service'] ?? 'cache.app';
317✔
124
                $imageCacheEnabled = $configs['image_cache_enabled'] ?? false;
317✔
125
                $ttl = $configs['ttl'] ?? null;
317✔
126

127
                $definition = $container->getDefinition(MetadataReader::class);
317✔
128
                $definition->setArgument('$analyzer', new Reference($analyzerId))
317✔
129
                        ->setArgument('$loader', new Reference($loaderId))
317✔
130
                        ->setArgument('$pathResolver', new Reference($resolverId))
317✔
131
                        ->setArgument('$cache', new Reference($cacheId))
317✔
132
            ->setArgument('$ttl', $configs['ttl'] ?? null)
317✔
133
            ->setArgument('$fallbackPath', $configs['fallback_image'] ?? null)
317✔
134
                ;
317✔
135
                $container->setParameter('progressive_image.image_cache_enabled', $imageCacheEnabled);
317✔
136
                $container->setParameter('progressive_image.ttl', $ttl);
317✔
137
                $container->setAlias('progressive_image.image_cache_service', $imageCacheServiceId);
317✔
138

139
                $responsiveConfig = $configs['responsive_strategy'] ?? [];
317✔
140
                $generatorId = $responsiveConfig['generator'] ?? null;
317✔
141

142
        if ($generatorId || class_exists(\Liip\ImagineBundle\LiipImagineBundle::class)) {
317✔
UNCOV
143
            $container->register(ResponsiveAttributeGenerator::class, ResponsiveAttributeGenerator::class)
308✔
UNCOV
144
                ->setArgument('$gridConfig', $responsiveConfig['grid'] ?? [])
308✔
UNCOV
145
                ->setArgument('$ratioConfig', $responsiveConfig['ratios'] ?? [])
308✔
UNCOV
146
                ->setArgument('$preloadCollector', new Reference(PreloadCollector::class))
308✔
UNCOV
147
                ->setArgument('$urlGenerator', $generatorId ? new Reference($generatorId) : new Reference(ResponsiveImageUrlGeneratorInterface::class))
308✔
UNCOV
148
            ;
308✔
149
        }
150

151
                $container->register(Image::class, Image::class)
317✔
152
                        ->setArgument('$analyzer', new Reference(MetadataReader::class))
317✔
153
                        ->setArgument('$pathDecorator', array_map(fn($id) => new Reference($id), $configs['path_decorators'] ?? []))
317✔
154
            ->setArgument('$responsiveAttributeGenerator', $generatorId || class_exists(\Liip\ImagineBundle\LiipImagineBundle::class) ? new Reference(ResponsiveAttributeGenerator::class) : null)
317✔
155
                        ->setArgument('$preloadCollector', new Reference(PreloadCollector::class))
317✔
156
            ->setShared(false)
317✔
157
                        ->addTag('twig.component')
317✔
158
                        ->setPublic(true);
317✔
159

160

161
        }
162

163

164
        private function configureResolvers(array $config, ContainerBuilder $container): void
165
        {
166
                $resolvers = $config['resolvers'] ?? [];
317✔
167
                foreach ($resolvers as $name => $resolverConfig) {
317✔
168
                        $id = 'progressive_image.resolver.' . $name;
185✔
169

170
                        if ('filesystem' === $resolverConfig['type']) {
185✔
171
                                $container->register($id, FileSystemResolver::class)
185✔
172
                                        ->setArgument('$roots', $resolverConfig['roots'] ?? ["%kernel.project_dir%/public"])
185✔
173
                                        ->setArgument('$allowUnresolvable', $resolverConfig['allowUnresolvable'] ?? false);
185✔
174
                        } elseif ('asset_mapper' === $resolverConfig['type']) {
×
175
                                $container->register($id, AssetMapperResolver::class);
×
176
                        }
177
                        // Chain resolver logic can be added here if needed
178
                }
179

180
                if (isset($config['resolver']) && !isset($resolvers[$config['resolver']])) {
317✔
181
                        // If a default resolver type is used but not defined in resolvers array
182
                        if (in_array($config['resolver'], ['filesystem', 'asset_mapper'])) {
×
183
                                // handle basic types if they are used as string directly
184
                        }
185
                }
186

187
                // Register a default alias if possible
188
                if (isset($config['resolver']) && isset($resolvers[$config['resolver']])) {
317✔
189
                        $container->setAlias('progressive_image.resolver.default', 'progressive_image.resolver.' . $config['resolver']);
185✔
190
                } elseif (!empty($resolvers)) {
132✔
191
                        $firstResolver = array_key_first($resolvers);
×
192
                        $container->setAlias('progressive_image.resolver.default', 'progressive_image.resolver.' . $firstResolver);
×
193
                } else {
194
                        // Fallback if no resolvers defined, register a basic one to avoid ServiceNotFoundException
195
                        $container->register('progressive_image.resolver.default', FileSystemResolver::class)
132✔
196
                                ->setArgument('$roots', ['%kernel.project_dir%/public'])
132✔
197
                                ->setArgument('$allowUnresolvable', true);
132✔
198
                }
199
        }
200
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc