From 3f0892510c053e0420860a19c2f48b0651a91fec Mon Sep 17 00:00:00 2001 From: Maik Sprenger Date: Tue, 25 Mar 2025 16:44:48 +0100 Subject: [PATCH 1/5] Only download mermaid.js if MERMAID_USE_CDN is False This is a follow-up to https://github.com/pysnippet/django-mermaid/issues/20 https://github.com/pysnippet/django-mermaid/pull/21 added a CDN feature, which means the added script tag will point to the CDN version of mermaid.js. But it still tries to download a copy to the package's static directory in AppConfig.ready. Because this isn't necessary in CDN mode and causes us a PermissionError during deployment, I'm proposing we only download in non-CDN mode. --- src/django_mermaid/apps.py | 26 ++++++++++++++++---------- tests/test_package.py | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 tests/test_package.py diff --git a/src/django_mermaid/apps.py b/src/django_mermaid/apps.py index 340bd9a..3b16c7d 100644 --- a/src/django_mermaid/apps.py +++ b/src/django_mermaid/apps.py @@ -7,18 +7,24 @@ from .templatetags import DEFAULT_VERSION from .templatetags import MERMAID_CDN +def download_if_necessary(version): + """Download mermaid.js from CDN if not already present""" + cdn = "https://cdnjs.cloudflare.com/ajax/libs/mermaid/%s/mermaid.min.js" % version + current_dir = pathlib.Path(__file__).parent + static_dir = current_dir / "static" + mermaid_dir = static_dir / "mermaid" / version + mermaid_js = mermaid_dir / "mermaid.js" + if not mermaid_js.exists() or \ + mermaid_js.stat().st_size == 0: + mermaid_dir.mkdir(parents=True, exist_ok=True) + urlretrieve(MERMAID_CDN % version, str(mermaid_js)) + class MermaidConfig(AppConfig): name = "django_mermaid" def ready(self): - """Download mermaid.js from CDN if not already present""" - version = getattr(settings, "MERMAID_VERSION", DEFAULT_VERSION) - current_dir = pathlib.Path(__file__).parent - static_dir = current_dir / "static" - mermaid_dir = static_dir / "mermaid" / version - mermaid_js = mermaid_dir / "mermaid.js" - if not mermaid_js.exists() or \ - mermaid_js.stat().st_size == 0: - mermaid_dir.mkdir(parents=True, exist_ok=True) - urlretrieve(MERMAID_CDN % version, str(mermaid_js)) + if not getattr(settings, "MERMAID_USE_CDN", False): + version = getattr(settings, "MERMAID_VERSION", DEFAULT_VERSION) + download_if_necessary(version) + diff --git a/tests/test_package.py b/tests/test_package.py new file mode 100644 index 0000000..c912279 --- /dev/null +++ b/tests/test_package.py @@ -0,0 +1,21 @@ +from django.test import override_settings +from unittest.mock import patch +from django.apps import apps + +@override_settings(MERMAID_USE_CDN=False) +@patch('django_mermaid.apps.download_if_necessary') +def test_download_called_when_use_cdn_false(mock_download): + # Re-run the AppConfig.ready() method manually + app_config = apps.get_app_config('django_mermaid') + app_config.ready() + + mock_download.assert_called_once() + + +@override_settings(MERMAID_USE_CDN=True) +@patch('django_mermaid.apps.download_if_necessary') +def test_download_not_called_when_use_cdn_true(mock_download): + app_config = apps.get_app_config('django_mermaid') + app_config.ready() + + mock_download.assert_not_called() \ No newline at end of file From 6923280eb0f08f0b33868ab15c3cec68faa4ed8a Mon Sep 17 00:00:00 2001 From: Maik Sprenger Date: Tue, 25 Mar 2025 16:48:42 +0100 Subject: [PATCH 2/5] Move existing test to new test_package module I think it's a better fit there, because the other tests all concern the template tag itself. Please note that the test fails for me locally. --- tests/test_package.py | 21 +++++++++++++++++++-- tests/test_tag.py | 7 ------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/tests/test_package.py b/tests/test_package.py index c912279..3d3837c 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -1,6 +1,17 @@ -from django.test import override_settings +from os.path import exists, join from unittest.mock import patch + from django.apps import apps +from django.test import override_settings + +try: + import site + + site_packages = site.getsitepackages()[0] +except (ImportError, IndexError): + import sysconfig + + site_packages = sysconfig.get_paths()["purelib"] @override_settings(MERMAID_USE_CDN=False) @patch('django_mermaid.apps.download_if_necessary') @@ -18,4 +29,10 @@ def test_download_not_called_when_use_cdn_true(mock_download): app_config = apps.get_app_config('django_mermaid') app_config.ready() - mock_download.assert_not_called() \ No newline at end of file + mock_download.assert_not_called() + + +def test_tag_use_custom_version(): + static_dir = join(site_packages, "django_mermaid", "static") + assert exists(join(static_dir, "mermaid", "8.6.3", "mermaid.js")) + assert exists(join(static_dir, "mermaid", "9.4.3", "mermaid.js")) diff --git a/tests/test_tag.py b/tests/test_tag.py index c3d6d55..85f48fd 100644 --- a/tests/test_tag.py +++ b/tests/test_tag.py @@ -1,6 +1,3 @@ -from os.path import exists -from os.path import join - import pytest from django.conf import settings from django.template import Context @@ -125,7 +122,3 @@ def test_tag_use_custom_theme_variables_with_base_theme(version, template_code): ) -def test_tag_use_custom_version(): - static_dir = join(site_packages, "django_mermaid", "static") - assert exists(join(static_dir, "mermaid", "8.6.3", "mermaid.js")) - assert exists(join(static_dir, "mermaid", "9.4.3", "mermaid.js")) From f843df792e123b4ae7dd0e0cc5a46d23fdbc48dc Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Tue, 25 Mar 2025 22:11:17 +0400 Subject: [PATCH 3/5] Fix PEP8 spacing issues and lint the code --- src/django_mermaid/templatetags/mermaid.py | 2 +- tests/test_package.py | 9 +++++---- tests/test_tag.py | 2 -- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/django_mermaid/templatetags/mermaid.py b/src/django_mermaid/templatetags/mermaid.py index 44e86cd..bcfa46f 100644 --- a/src/django_mermaid/templatetags/mermaid.py +++ b/src/django_mermaid/templatetags/mermaid.py @@ -55,7 +55,7 @@ def startmermaid(parser, token): else: theme = None - nodelist = parser.parse(('endmermaid',)) + nodelist = parser.parse(("endmermaid",)) parser.delete_first_token() return MermaidNode(nodelist, theme) diff --git a/tests/test_package.py b/tests/test_package.py index 3d3837c..b7a2e84 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -13,20 +13,21 @@ site_packages = sysconfig.get_paths()["purelib"] + @override_settings(MERMAID_USE_CDN=False) -@patch('django_mermaid.apps.download_if_necessary') +@patch("django_mermaid.apps.download_if_necessary") def test_download_called_when_use_cdn_false(mock_download): # Re-run the AppConfig.ready() method manually - app_config = apps.get_app_config('django_mermaid') + app_config = apps.get_app_config("django_mermaid") app_config.ready() mock_download.assert_called_once() @override_settings(MERMAID_USE_CDN=True) -@patch('django_mermaid.apps.download_if_necessary') +@patch("django_mermaid.apps.download_if_necessary") def test_download_not_called_when_use_cdn_true(mock_download): - app_config = apps.get_app_config('django_mermaid') + app_config = apps.get_app_config("django_mermaid") app_config.ready() mock_download.assert_not_called() diff --git a/tests/test_tag.py b/tests/test_tag.py index 85f48fd..b595b6b 100644 --- a/tests/test_tag.py +++ b/tests/test_tag.py @@ -120,5 +120,3 @@ def test_tag_use_custom_theme_variables_with_base_theme(version, template_code): "" % version ) - - From 5daf75d1b4f03aeb435a6eda710d0471d27412d1 Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Tue, 25 Mar 2025 22:13:51 +0400 Subject: [PATCH 4/5] Update the package metadata --- setup.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.cfg b/setup.cfg index 7372df3..81f1bde 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,6 +32,9 @@ classifiers = Framework :: Django :: 4.0 Framework :: Django :: 4.1 Framework :: Django :: 4.2 + Framework :: Django :: 5.0 + Framework :: Django :: 5.1 + Framework :: Django :: 5.2 Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: Python :: 3.6 @@ -40,6 +43,7 @@ classifiers = Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 + Programming Language :: Python :: 3.12 License :: OSI Approved :: MIT License [options] From 76bc82b5828fd84bb8697ad19f4103c3628b0f78 Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Tue, 25 Mar 2025 22:14:09 +0400 Subject: [PATCH 5/5] Upgrade the version to `0.1.0` --- src/django_mermaid/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/django_mermaid/__init__.py b/src/django_mermaid/__init__.py index 00ec2dc..3dc1f76 100644 --- a/src/django_mermaid/__init__.py +++ b/src/django_mermaid/__init__.py @@ -1 +1 @@ -__version__ = "0.0.9" +__version__ = "0.1.0"