diff --git a/DEVELOPERS b/DEVELOPERS index f22a1c4976..6ffe20426b 100644 --- a/DEVELOPERS +++ b/DEVELOPERS @@ -1982,10 +1982,13 @@ N: Nicolas Carrier F: package/bmap-tools/ F: package/php-xdebug/ F: package/python-augeas/ +F: package/python-flask-expects-json/ F: support/testing/tests/package/sample_bmap_tools.sh F: support/testing/tests/package/sample_python_augeas.py +F: support/testing/tests/package/sample_python_flask_expects_json.py F: support/testing/tests/package/test_bmap_tools.py F: support/testing/tests/package/test_python_augeas.py +F: support/testing/tests/package/test_python_flask_expects_json.py N: Nicolas Cavallari F: package/libgit2/ @@ -2682,6 +2685,7 @@ F: package/pkg-generic.mk F: package/python/ F: package/python3/ F: package/python-augeas/ +F: package/python-flask-expects-json/ F: package/python-mad/ F: package/python-serial/ F: package/qextserialport/ @@ -2697,8 +2701,10 @@ F: package/weston/ F: support/testing/tests/boot/test_syslinux.py F: support/testing/tests/package/sample_python_augeas.py F: support/testing/tests/package/sample_python_flask.py +F: support/testing/tests/package/sample_python_flask_expects_json.py F: support/testing/tests/package/test_python_augeas.py F: support/testing/tests/package/test_python_flask.py +F: support/testing/tests/package/test_python_flask_expects_json.py F: toolchain/ N: Timo Ketola diff --git a/package/Config.in b/package/Config.in index f2f80da3ff..c334fa5b67 100644 --- a/package/Config.in +++ b/package/Config.in @@ -999,6 +999,7 @@ menu "External python modules" source "package/python-flask/Config.in" source "package/python-flask-babel/Config.in" source "package/python-flask-cors/Config.in" + source "package/python-flask-expects-json/Config.in" source "package/python-flask-jsonrpc/Config.in" source "package/python-flask-login/Config.in" source "package/python-flask-sqlalchemy/Config.in" diff --git a/package/python-flask-expects-json/Config.in b/package/python-flask-expects-json/Config.in new file mode 100644 index 0000000000..901234762e --- /dev/null +++ b/package/python-flask-expects-json/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_PYTHON_FLASK_EXPECTS_JSON + bool "python-flask-expects-json" + select BR2_PACKAGE_PYTHON_FLASK # runtime + select BR2_PACKAGE_PYTHON_JSONSCHEMA # runtime + help + Decorator for REST endpoints in flask. Validate JSON request + data. + + https://github.com/fischerfredl/flask-expects-json diff --git a/package/python-flask-expects-json/python-flask-expects-json.hash b/package/python-flask-expects-json/python-flask-expects-json.hash new file mode 100644 index 0000000000..c023222fd7 --- /dev/null +++ b/package/python-flask-expects-json/python-flask-expects-json.hash @@ -0,0 +1,5 @@ +# md5, sha256 from https://pypi.org/pypi/flask-expects-json/json +md5 c1fb8ede58db312d7923212dc97b8ab4 flask-expects-json-1.5.0.tar.gz +sha256 0087dc3d089f1ac75a1fc0f259f4dbd02bbb9c356e92e1a080f2309e2f75d053 flask-expects-json-1.5.0.tar.gz +# Locally computed sha256 checksums +sha256 06154a99fdc664107294a0a5e7e68f776078d075408dd32bbeaa7340fdd39e73 LICENSE.txt diff --git a/package/python-flask-expects-json/python-flask-expects-json.mk b/package/python-flask-expects-json/python-flask-expects-json.mk new file mode 100644 index 0000000000..487f15d4e5 --- /dev/null +++ b/package/python-flask-expects-json/python-flask-expects-json.mk @@ -0,0 +1,14 @@ +################################################################################ +# +# python-flask-expects-json +# +################################################################################ + +PYTHON_FLASK_EXPECTS_JSON_VERSION = 1.5.0 +PYTHON_FLASK_EXPECTS_JSON_SOURCE = flask-expects-json-$(PYTHON_FLASK_EXPECTS_JSON_VERSION).tar.gz +PYTHON_FLASK_EXPECTS_JSON_SITE = https://files.pythonhosted.org/packages/4c/4a/9d9d050af700fb3feebd1f8466e73d65ce8b4709f27773e07100b0993451 +PYTHON_FLASK_EXPECTS_JSON_SETUP_TYPE = setuptools +PYTHON_FLASK_EXPECTS_JSON_LICENSE = MIT +PYTHON_FLASK_EXPECTS_JSON_LICENSE_FILES = LICENSE.txt + +$(eval $(python-package)) diff --git a/support/testing/tests/package/sample_python_flask_expects_json.py b/support/testing/tests/package/sample_python_flask_expects_json.py new file mode 100644 index 0000000000..d45026dd49 --- /dev/null +++ b/support/testing/tests/package/sample_python_flask_expects_json.py @@ -0,0 +1,18 @@ +from flask import Flask +from flask_expects_json import expects_json +app = Flask(__name__) + +schema = { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'email': {'type': 'string'}, + }, + 'required': ['name', 'email'] +} + + +@app.route('/', methods=['POST']) +@expects_json(schema) +def hello_world(): + return 'Hello, World!' diff --git a/support/testing/tests/package/test_python_flask_expects_json.py b/support/testing/tests/package/test_python_flask_expects_json.py new file mode 100644 index 0000000000..b7326f5d9e --- /dev/null +++ b/support/testing/tests/package/test_python_flask_expects_json.py @@ -0,0 +1,38 @@ +from tests.package.test_python import TestPythonPackageBase +import os +import time + + +class TestPythonPy3FlaskExpectsJson(TestPythonPackageBase): + __test__ = True + config = TestPythonPackageBase.config + \ + """ + BR2_PACKAGE_LIBCURL=y + BR2_PACKAGE_LIBCURL_CURL=y + BR2_PACKAGE_PYTHON3=y + BR2_PACKAGE_PYTHON_FLASK=y + BR2_PACKAGE_PYTHON_FLASK_EXPECTS_JSON=y + """ + sample_scripts = ["tests/package/sample_python_flask_expects_json.py"] + timeout = 60 + + def try_json(self, payload, expects): + cmd = """curl -s -o /dev/null -w "%%{http_code}\\n" -X POST """ + cmd += """-H "Content-Type: application/json" -d '%s' http://127.0.0.1:5000""" % payload + output, exit_code = self.emulator.run(cmd, timeout=self.timeout) + self.assertEqual(exit_code, 0) + self.assertEqual(output[-1], str(expects)) + + def test_run(self): + self.login() + self.check_sample_scripts_exist() + cmd = "FLASK_APP=%s %s -m flask run > /dev/null 2>&1 &" % (os.path.basename(self.sample_scripts[0]), + self.interpreter) + _, exit_code = self.emulator.run(cmd, timeout=self.timeout) + + # Give enough time for the flask server to start up + time.sleep(15) + + self.try_json("""{"email": "test", "name": "test"}""", 200) + self.try_json("""{"email": "test", "name": 2}""", 400) + self.try_json("""{"email": "test"}""", 400)