Skip to content

Commit 1792e80

Browse files
karolyifjsj
authored andcommitted
Adding skip_common_chunks option to the get_files() template tag
1 parent 6d77462 commit 1792e80

File tree

6 files changed

+68
-39
lines changed

6 files changed

+68
-39
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ For more general information, view the [readme](README.md).
55
Releases are added to the
66
[github release page](https://github.com/ezhome/django-webpack-loader/releases).
77

8+
## [3.0.1] -- 2023-12-29
9+
10+
Added `skip_common_chunks` option to the `get_files()` template tag.
11+
812
## [3.0.0] -- 2023-12-19
913

1014
- Fix support for `publicPath: auto` in Webpack config, check updated examples at https://github.com/django-webpack/django-webpack-loader/tree/master/examples

tests/app/tests/test_webpack.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -443,9 +443,9 @@ def test_emits_warning_on_no_request_in_djangoengine(self):
443443
) # type: Template
444444
request = self.factory.get(path='/')
445445
output = nodups_template.render(context=Context({'request': request}))
446-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
447-
self.assertIsNotNone(used_tags, msg=(
448-
'_webpack_loader_used_tags should be a property of request!'))
446+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
447+
self.assertIsNotNone(used_urls, msg=(
448+
'_webpack_loader_used_urls should be a property of request!'))
449449
self.assertEqual(output.count(asset_app1), 1)
450450
self.assertEqual(output.count(asset_app2), 1)
451451
self.assertEqual(output.count(asset_vendor), 1)
@@ -518,9 +518,9 @@ def test_emits_warning_on_no_request_in_jinja2engine(self):
518518
template_name='home-deduplicated.jinja'
519519
) # type: Jinja2Template
520520
output = nodups_template.render(request=request)
521-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
522-
self.assertIsNotNone(used_tags, msg=(
523-
'_webpack_loader_used_tags should be a property of request!'))
521+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
522+
self.assertIsNotNone(used_urls, msg=(
523+
'_webpack_loader_used_urls should be a property of request!'))
524524
self.assertEqual(output.count(asset_app1), 1)
525525
self.assertEqual(output.count(asset_app2), 1)
526526
self.assertEqual(output.count(asset_vendor), 1)
@@ -546,10 +546,10 @@ def _assert_common_chunks_duplicated_djangoengine(self, template):
546546
'</script>')
547547
rendered_template = template.render(
548548
context=None, request=request)
549-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
549+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
550550

551-
self.assertIsNotNone(used_tags, msg=(
552-
'_webpack_loader_used_tags should be a property of request!'))
551+
self.assertIsNotNone(used_urls, msg=(
552+
'_webpack_loader_used_urls should be a property of request!'))
553553
self.assertEqual(rendered_template.count(asset_app1), 1)
554554
self.assertEqual(rendered_template.count(asset_app2), 1)
555555
self.assertEqual(rendered_template.count(asset_vendor), 2)
@@ -573,10 +573,10 @@ def _assert_common_chunks_not_duplicated_djangoengine(self, template):
573573
'</script>')
574574
rendered_template = template.render(
575575
context=None, request=request)
576-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
576+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
577577

578-
self.assertIsNotNone(used_tags, msg=(
579-
'_webpack_loader_used_tags should be a property of request!'))
578+
self.assertIsNotNone(used_urls, msg=(
579+
'_webpack_loader_used_urls should be a property of request!'))
580580
self.assertEqual(rendered_template.count(asset_app1), 1)
581581
self.assertEqual(rendered_template.count(asset_app2), 1)
582582
self.assertEqual(rendered_template.count(asset_vendor), 1)
@@ -620,9 +620,9 @@ def _assert_common_chunks_duplicated_jinja2engine(self, view):
620620
self.assertEqual(content.count(asset_vendor), 4)
621621
self.assertEqual(content.count(asset_app1), 2)
622622
self.assertEqual(content.count(asset_app2), 2)
623-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
624-
self.assertIsNotNone(used_tags, msg=(
625-
'_webpack_loader_used_tags should be a property of request!'))
623+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
624+
self.assertIsNotNone(used_urls, msg=(
625+
'_webpack_loader_used_urls should be a property of request!'))
626626

627627
def _assert_common_chunks_not_duplicated_jinja2engine(self, view):
628628
"""
@@ -663,9 +663,9 @@ def _assert_common_chunks_not_duplicated_jinja2engine(self, view):
663663
self.assertEqual(content.count(asset_vendor), 1)
664664
self.assertEqual(content.count(asset_app1), 1)
665665
self.assertEqual(content.count(asset_app2), 1)
666-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
667-
self.assertIsNotNone(used_tags, msg=(
668-
'_webpack_loader_used_tags should be a property of request!'))
666+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
667+
self.assertIsNotNone(used_urls, msg=(
668+
'_webpack_loader_used_urls should be a property of request!'))
669669

670670
def test_skip_common_chunks_templatetag_djangoengine(self):
671671
"""Test case for deduplication of modules with the django engine via the render_bundle template tag."""

webpack_loader/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
__author__ = "Vinta Software"
2-
__version__ = "3.0.0"
2+
__version__ = "3.0.1"
33

44
import django
55

webpack_loader/contrib/jinja2ext.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22
from jinja2.runtime import Context
33
from jinja2.utils import pass_context
44

5-
from ..templatetags.webpack_loader import render_bundle
5+
from ..templatetags.webpack_loader import get_files, render_bundle
66

77

88
@pass_context
99
def _render_bundle(context: Context, *args, **kwargs):
1010
return render_bundle(context, *args, **kwargs)
1111

1212

13+
@pass_context
14+
def _get_files(context: Context, *args, **kwargs):
15+
return get_files(context=context, *args, **kwargs)
16+
17+
1318
class WebpackExtension(Extension):
1419
def __init__(self, environment):
1520
super(WebpackExtension, self).__init__(environment)
1621
environment.globals["render_bundle"] = _render_bundle
22+
environment.globals["webpack_get_files"] = _get_files

webpack_loader/templatetags/webpack_loader.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
'You have specified skip_common_chunks=True but the passed context '
1111
'doesn\'t have a request. django_webpack_loader needs a request object to '
1212
'filter out duplicate chunks. Please see https://github.com/django-webpack'
13-
'/django-webpack-loader#skipping-the-generation-of-multiple-common-chunks')
13+
'/django-webpack-loader#use-skip_common_chunks-on-render_bundle')
1414

1515

1616
@register.simple_tag(takes_context=True)
@@ -26,33 +26,51 @@ def render_bundle(
2626
if request is None:
2727
if skip_common_chunks:
2828
warn(message=_WARNING_MESSAGE, category=RuntimeWarning)
29-
return mark_safe('\n'.join(tags))
30-
used_tags = getattr(request, '_webpack_loader_used_tags', None)
31-
if not used_tags:
32-
used_tags = request._webpack_loader_used_tags = set()
29+
return mark_safe('\n'.join(tags.values()))
30+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
31+
if not used_urls:
32+
used_urls = request._webpack_loader_used_urls = set()
3333
if skip_common_chunks:
34-
tags = [tag for tag in tags if tag not in used_tags]
35-
used_tags.update(tags)
36-
return mark_safe('\n'.join(tags))
34+
tags = {url: tag for url, tag in tags.items() if url not in used_urls}
35+
used_urls.update(tags)
36+
return mark_safe('\n'.join(tags.values()))
3737

3838

3939
@register.simple_tag
4040
def webpack_static(asset_name, config='DEFAULT'):
4141
return utils.get_static(asset_name, config=config)
4242

4343

44-
@register.simple_tag
45-
def get_files(bundle_name, extension=None, config='DEFAULT'):
44+
@register.simple_tag(takes_context=True)
45+
def get_files(
46+
context, bundle_name, extension=None, config='DEFAULT',
47+
skip_common_chunks=None):
4648
"""
4749
Returns all chunks in the given bundle.
4850
Example usage::
4951
5052
{% get_files 'editor' 'css' as editor_css_chunks %}
5153
CKEDITOR.config.contentsCss = '{{ editor_css_chunks.0.url }}';
5254
55+
:param context: The request, if you want to use `skip_common_chunks`
5356
:param bundle_name: The name of the bundle
5457
:param extension: (optional) filter by extension
5558
:param config: (optional) the name of the configuration
59+
:param skip_common_chunks: (optional) `True` if you want to skip returning already rendered common chunks
5660
:return: a list of matching chunks
5761
"""
58-
return utils.get_files(bundle_name, extension=extension, config=config)
62+
if skip_common_chunks is None:
63+
skip_common_chunks = utils.get_skip_common_chunks(config)
64+
if not skip_common_chunks:
65+
return utils.get_files(bundle_name, extension=extension, config=config)
66+
request = context.get('request')
67+
result = utils.get_files(bundle_name, extension=extension, config=config)
68+
if not skip_common_chunks:
69+
return result
70+
if request is None:
71+
warn(message=_WARNING_MESSAGE, category=RuntimeWarning)
72+
return result
73+
used_urls = getattr(request, '_webpack_loader_used_urls', None)
74+
if not used_urls:
75+
used_urls = request._webpack_loader_used_urls = set()
76+
return [x for x in result if x['url'] not in used_urls]

webpack_loader/utils.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections import OrderedDict
12
from importlib import import_module
23
from django.conf import settings
34
from .config import load_config
@@ -69,32 +70,32 @@ def get_as_tags(bundle_name, extension=None, config='DEFAULT', suffix='', attrs=
6970

7071
loader = get_loader(config)
7172
bundle = _get_bundle(loader, bundle_name, extension)
72-
tags = []
73+
result = OrderedDict()
7374

7475
for chunk in bundle:
7576
if chunk['name'].endswith(('.js', '.js.gz')):
7677
if is_preload:
77-
tags.append((
78+
result[chunk['url']] = (
7879
'<link rel="preload" as="script" href="{0}" {1}/>'
79-
).format(''.join([chunk['url'], suffix]), attrs))
80+
).format(''.join([chunk['url'], suffix]), attrs)
8081
else:
81-
tags.append((
82+
result[chunk['url']] = (
8283
'<script src="{0}"{2}{1}></script>'
8384
).format(
8485
''.join([chunk['url'], suffix]),
8586
attrs,
8687
loader.get_integrity_attr(chunk),
87-
))
88+
)
8889
elif chunk['name'].endswith(('.css', '.css.gz')):
89-
tags.append((
90+
result[chunk['url']] = (
9091
'<link href="{0}" rel={2}{3}{1}/>'
9192
).format(
9293
''.join([chunk['url'], suffix]),
9394
attrs,
9495
'"stylesheet"' if not is_preload else '"preload" as="style"',
9596
loader.get_integrity_attr(chunk),
96-
))
97-
return tags
97+
)
98+
return result
9899

99100

100101
def get_static(asset_name, config='DEFAULT'):

0 commit comments

Comments
 (0)