diff --git a/DEVELOPERS b/DEVELOPERS index 6254f2e1db..f20bd5ce3f 100644 --- a/DEVELOPERS +++ b/DEVELOPERS @@ -2259,8 +2259,10 @@ F: package/picotool/ F: package/python-immutabledict/ F: package/python-jc/ F: package/python-ruamel-yaml-clib/ +F: package/python-waitress/ F: support/testing/tests/package/test_python_fastapi.py F: support/testing/tests/package/test_python_ruamel_yaml.py +F: support/testing/tests/package/test_python_waitress.py F: support/testing/tests/package/sample_python_fastapi.py F: support/testing/tests/package/sample_python_ruamel_yaml.py diff --git a/package/Config.in b/package/Config.in index e501bca3aa..da88832d37 100644 --- a/package/Config.in +++ b/package/Config.in @@ -1466,6 +1466,7 @@ menu "External python modules" source "package/python-validators/Config.in" source "package/python-versiontools/Config.in" source "package/python-visitor/Config.in" + source "package/python-waitress/Config.in" source "package/python-watchdog/Config.in" source "package/python-wcwidth/Config.in" source "package/python-weasyprint/Config.in" diff --git a/package/python-waitress/Config.in b/package/python-waitress/Config.in new file mode 100644 index 0000000000..7d8c73a650 --- /dev/null +++ b/package/python-waitress/Config.in @@ -0,0 +1,11 @@ +config BR2_PACKAGE_PYTHON_WAITRESS + bool "python-waitress" + help + Waitress WSGI server. + + Waitress is a production-quality pure-Python WSGI server + with very acceptable performance. It has no dependencies + except ones which live in the Python standard library. + It supports HTTP/1.0 and HTTP/1.1. + + https://github.com/Pylons/waitress diff --git a/package/python-waitress/python-waitress.hash b/package/python-waitress/python-waitress.hash new file mode 100644 index 0000000000..c1663a351a --- /dev/null +++ b/package/python-waitress/python-waitress.hash @@ -0,0 +1,5 @@ +# md5, sha256 from https://pypi.org/pypi/waitress/json +md5 b8c671ed131b84a0099493f445c98014 waitress-3.0.0.tar.gz +sha256 005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1 waitress-3.0.0.tar.gz +# Locally computed sha256 checksums +sha256 3e671db11df687516cc1db5b3d65e4aa383eaca3c20cea3faf53a0f7335d0a3c LICENSE.txt diff --git a/package/python-waitress/python-waitress.mk b/package/python-waitress/python-waitress.mk new file mode 100644 index 0000000000..c1618817dc --- /dev/null +++ b/package/python-waitress/python-waitress.mk @@ -0,0 +1,14 @@ +################################################################################ +# +# python-waitress +# +################################################################################ + +PYTHON_WAITRESS_VERSION = 3.0.0 +PYTHON_WAITRESS_SOURCE = waitress-$(PYTHON_WAITRESS_VERSION).tar.gz +PYTHON_WAITRESS_SITE = https://files.pythonhosted.org/packages/70/34/cb77e5249c433eb177a11ab7425056b32d3b57855377fa1e38b397412859 +PYTHON_WAITRESS_SETUP_TYPE = setuptools +PYTHON_WAITRESS_LICENSE = ZPL-2.1 +PYTHON_WAITRESS_LICENSE_FILES = LICENSE.txt + +$(eval $(python-package)) diff --git a/support/testing/tests/package/test_python_waitress.py b/support/testing/tests/package/test_python_waitress.py new file mode 100644 index 0000000000..46f04109c0 --- /dev/null +++ b/support/testing/tests/package/test_python_waitress.py @@ -0,0 +1,34 @@ +import time + +from tests.package.test_python import TestPythonPackageBase + + +class TestPythonWaitress(TestPythonPackageBase): + __test__ = True + config = TestPythonPackageBase.config + \ + """ + BR2_PACKAGE_PYTHON3=y + BR2_PACKAGE_PYTHON_FLASK=y + BR2_PACKAGE_PYTHON_WAITRESS=y + """ + + sample_scripts = ["tests/package/sample_python_flask.py"] + + def test_run(self): + self.login() + self.check_sample_scripts_exist() + cmd = self.interpreter + " -m waitress sample_python_flask:app > /dev/null 2>&1 &" + # give some time to setup the server + _, exit = self.emulator.run(cmd, timeout=self.timeout) + + # Give enough time for the uvicorn server to start up + for attempt in range(30): + time.sleep(1) + + cmd = "wget -q -O - http://127.0.0.1:8080/" + output, exit_code = self.emulator.run(cmd, timeout=self.timeout) + if exit_code == 0: + self.assertEqual(output[0], 'Hello, World!') + break + else: + self.assertTrue(False, "Timeout while waiting for waitress server")