diff mbox series

[2/2] package/python-whitenoise: new package

Message ID 20240216131815.318315-2-buildroot@bubu1.eu
State New
Headers show
Series [1/2] support/testing: remove hardcoded sleep from python-django test | expand

Commit Message

Marcus Hoffmann Feb. 16, 2024, 1:18 p.m. UTC
The test is using the django integration of whitenoise as it's the most
common setup and allows to model the test case after the django one as
well.

The setup we need to do is a bit more complicated though and follows
the whitenoise getting started documentation [1].

We then request a .css file from the django admin app that is enabled
by default in template project. Due to running django's development
server with --nostatic we ensure that static file handling is taken over
by whitenoise.

[1] https://whitenoise.readthedocs.io/en/stable/django.html

Signed-off-by: Marcus Hoffmann <buildroot@bubu1.eu>
---
 package/Config.in                             |  1 +
 package/python-whitenoise/Config.in           |  7 ++++
 .../python-whitenoise/python-whitenoise.hash  |  5 +++
 .../python-whitenoise/python-whitenoise.mk    | 14 +++++++
 .../tests/package/test_python_django.py       |  1 +
 .../tests/package/test_python_whitenoise.py   | 41 +++++++++++++++++++
 6 files changed, 69 insertions(+)
 create mode 100644 package/python-whitenoise/Config.in
 create mode 100644 package/python-whitenoise/python-whitenoise.hash
 create mode 100644 package/python-whitenoise/python-whitenoise.mk
 create mode 100644 support/testing/tests/package/test_python_whitenoise.py

Comments

Thomas Petazzoni Aug. 5, 2024, 10:02 a.m. UTC | #1
Hello Marcus,

On Fri, 16 Feb 2024 14:18:14 +0100
Marcus Hoffmann via buildroot <buildroot@buildroot.org> wrote:

> diff --git a/support/testing/tests/package/test_python_django.py b/support/testing/tests/package/test_python_django.py
> index 0973467a2a..ac1dc81359 100644
> --- a/support/testing/tests/package/test_python_django.py
> +++ b/support/testing/tests/package/test_python_django.py
> @@ -36,6 +36,7 @@ class TestPythonPy3Django(TestPythonDjango):
>      config = TestPythonDjango.config + \
>          """
>          BR2_PACKAGE_PYTHON3=y
> +        BR2_PACKAGE_PYTHON3_PY_PYC=y
>          BR2_PACKAGE_PYTHON_DJANGO=y
>          BR2_PACKAGE_PYTHON3_SQLITE=y
>          """

I'm confused about this change. How is this related to whitenoise?

I see in reply to PATCH 1/2, you mentioned:

"""
The django test (and the whitenoise test introduced in the next patch) 
actually both currently fail because of a problem with django 5.0 and 
.pyc only installations. [1]

This now has "release blocker" priority at django and a proposed patch 
(that I tested locally but hasn't been officially submitted to django 
yet) so hopefully this will be fixed with the next django point release 
in a couple of weeks.
"""

But now PATCH 1/2 is merged, but not PATCH 2/2. Could you clarify this
aspect? Is master broken because that snippet of PATCH 2/2 should have
been in PATCH 1/2, or?

Thomas
Marcus Hoffmann Aug. 7, 2024, 10:25 a.m. UTC | #2
Hi Thomas,

On 05.08.24 12:02, Thomas Petazzoni wrote:
> Hello Marcus,
> 
> On Fri, 16 Feb 2024 14:18:14 +0100
> Marcus Hoffmann via buildroot <buildroot@buildroot.org> wrote:
> 
>> diff --git a/support/testing/tests/package/test_python_django.py b/support/testing/tests/package/test_python_django.py
>> index 0973467a2a..ac1dc81359 100644
>> --- a/support/testing/tests/package/test_python_django.py
>> +++ b/support/testing/tests/package/test_python_django.py
>> @@ -36,6 +36,7 @@ class TestPythonPy3Django(TestPythonDjango):
>>       config = TestPythonDjango.config + \
>>           """
>>           BR2_PACKAGE_PYTHON3=y
>> +        BR2_PACKAGE_PYTHON3_PY_PYC=y
>>           BR2_PACKAGE_PYTHON_DJANGO=y
>>           BR2_PACKAGE_PYTHON3_SQLITE=y
>>           """
> 
> I'm confused about this change. How is this related to whitenoise?

Not at all related and can just be dropped. This was a leftover from 
some Django debugging I did around the time I sent this patch.

Django (and this the django and whitenoise tests) were broken in 
February with out default .pyc only install method.

This has been fixed upstream in django and django has been updated to a 
fixed version in buildroot since then.


> 
> I see in reply to PATCH 1/2, you mentioned:
> 
> """
> The django test (and the whitenoise test introduced in the next patch)
> actually both currently fail because of a problem with django 5.0 and
> .pyc only installations. [1]
> 
> This now has "release blocker" priority at django and a proposed patch
> (that I tested locally but hasn't been officially submitted to django
> yet) so hopefully this will be fixed with the next django point release
> in a couple of weeks.
> """
> 
> But now PATCH 1/2 is merged, but not PATCH 2/2. Could you clarify this
> aspect? Is master broken because that snippet of PATCH 2/2 should have
> been in PATCH 1/2, or?
> 
> Thomas

Marcus
diff mbox series

Patch

diff --git a/package/Config.in b/package/Config.in
index bf0fe078b9..7180aaea63 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -1417,6 +1417,7 @@  menu "External python modules"
 	source "package/python-websocket-client/Config.in"
 	source "package/python-websockets/Config.in"
 	source "package/python-werkzeug/Config.in"
+	source "package/python-whitenoise/Config.in"
 	source "package/python-whoosh/Config.in"
 	source "package/python-wrapt/Config.in"
 	source "package/python-ws4py/Config.in"
diff --git a/package/python-whitenoise/Config.in b/package/python-whitenoise/Config.in
new file mode 100644
index 0000000000..47df3ad5bf
--- /dev/null
+++ b/package/python-whitenoise/Config.in
@@ -0,0 +1,7 @@ 
+config BR2_PACKAGE_PYTHON_WHITENOISE
+	bool "python-whitenoise"
+	help
+	  Radically simplified static file serving for WSGI
+	  applications.
+
+	  https://github.com/evansd/whitenoise
diff --git a/package/python-whitenoise/python-whitenoise.hash b/package/python-whitenoise/python-whitenoise.hash
new file mode 100644
index 0000000000..4e239f4ab1
--- /dev/null
+++ b/package/python-whitenoise/python-whitenoise.hash
@@ -0,0 +1,5 @@ 
+# md5, sha256 from https://pypi.org/pypi/whitenoise/json
+md5  4926cee7317ac12533549c08043ee322  whitenoise-6.6.0.tar.gz
+sha256  8998f7370973447fac1e8ef6e8ded2c5209a7b1f67c1012866dbcd09681c3251  whitenoise-6.6.0.tar.gz
+# Locally computed sha256 checksums
+sha256  ebfd469b4fb6b5adada547747e1e8da725ecf20595d54aced043275d4f4a3600  LICENSE
diff --git a/package/python-whitenoise/python-whitenoise.mk b/package/python-whitenoise/python-whitenoise.mk
new file mode 100644
index 0000000000..a601157491
--- /dev/null
+++ b/package/python-whitenoise/python-whitenoise.mk
@@ -0,0 +1,14 @@ 
+################################################################################
+#
+# python-whitenoise
+#
+################################################################################
+
+PYTHON_WHITENOISE_VERSION = 6.6.0
+PYTHON_WHITENOISE_SOURCE = whitenoise-$(PYTHON_WHITENOISE_VERSION).tar.gz
+PYTHON_WHITENOISE_SITE = https://files.pythonhosted.org/packages/16/e3/adddb43cf8eb924e18eca677d4e40d47348566224b724cb8d1eaf6a48d1b
+PYTHON_WHITENOISE_SETUP_TYPE = setuptools
+PYTHON_WHITENOISE_LICENSE = MIT
+PYTHON_WHITENOISE_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/support/testing/tests/package/test_python_django.py b/support/testing/tests/package/test_python_django.py
index 0973467a2a..ac1dc81359 100644
--- a/support/testing/tests/package/test_python_django.py
+++ b/support/testing/tests/package/test_python_django.py
@@ -36,6 +36,7 @@  class TestPythonPy3Django(TestPythonDjango):
     config = TestPythonDjango.config + \
         """
         BR2_PACKAGE_PYTHON3=y
+        BR2_PACKAGE_PYTHON3_PY_PYC=y
         BR2_PACKAGE_PYTHON_DJANGO=y
         BR2_PACKAGE_PYTHON3_SQLITE=y
         """
diff --git a/support/testing/tests/package/test_python_whitenoise.py b/support/testing/tests/package/test_python_whitenoise.py
new file mode 100644
index 0000000000..ff9bcf5ee7
--- /dev/null
+++ b/support/testing/tests/package/test_python_whitenoise.py
@@ -0,0 +1,41 @@ 
+import time
+
+from tests.package.test_python import TestPythonPackageBase
+
+
+class TestPythonPy3Whitenoise(TestPythonPackageBase):
+    __test__ = True
+    config = TestPythonPackageBase.config + \
+        """
+        BR2_PACKAGE_PYTHON3=y
+        BR2_PACKAGE_PYTHON_DJANGO=y
+        BR2_PACKAGE_PYTHON_WHITENOISE=y
+        BR2_PACKAGE_PYTHON3_SQLITE=y
+        """
+
+    def test_run(self):
+        self.login()
+        timeout = 35
+
+        cmd = "cd /opt && /usr/bin/django-admin startproject testsite"
+        self.assertRunOk(cmd, timeout=timeout)
+        # STATIC_ROOT needs to be set for 'collectstatic' to work.
+        self.emulator.run("echo 'STATIC_ROOT = BASE_DIR / \"staticfiles\"' >> /opt/testsite/testsite/settings.py")
+        cmd = "cd /opt/testsite && " + self.interpreter + " ./manage.py collectstatic"
+        self.assertRunOk(cmd, timeout=timeout)
+        # whitenoise docs say it needs to be added directly after SecurityMiddleware, so we do this here with sed.
+        cmd = """sed -i -e /django.middleware.security.SecurityMiddleware/a\ \\"whitenoise.middleware.WhiteNoiseMiddleware\\", /opt/testsite/testsite/settings.py"""
+        self.assertRunOk(cmd, timeout=timeout)
+        # --nostatic ensures the builtin django server doesn't serve the static files,
+        # so we can test that whitenoise serves them
+        cmd = "cd /opt/testsite && " + self.interpreter + " ./manage.py runserver --nostatic 0.0.0.0:1234 > /dev/null 2>&1 & "
+        self.assertRunOk(cmd, timeout=timeout)
+        # give some time to setup the server
+        for attempt in range(30 * self.emulator.timeout_multiplier):
+            time.sleep(1)
+            cmd = "wget http://127.0.0.1:1234/static/admin/css/base.css"
+            _, exit_code = self.emulator.run(cmd)
+            if exit_code == 0:
+                break
+        else:
+            self.assertTrue(False, "Timeout while waiting for django server")