[Buildroot] [git commit] package/python-flask-expects-json: new package

Arnout Vandecappelle (Essensium/Mind) arnout at mind.be
Thu Sep 23 19:53:57 UTC 2021


commit: https://git.buildroot.net/buildroot/commit/?id=e6ee07f41a2b11b8dedbd3fc19ceef2870ecc93a
branch: https://git.buildroot.net/buildroot/commit/?id=refs/heads/master

This commit adds a new package called python-flask-expects-json, which
also to validate the JSON blurbs submitted to a Flask web
application. A runtime test is added as well, making sure that the
package minimally works with an example Flask application.

The files added by this commit are associated both to Nicolas Carrier
and myself in the DEVELOPERS file, as Nicolas is also interested in
this package.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>
---
 DEVELOPERS                                         |  6 ++++
 package/Config.in                                  |  1 +
 package/python-flask-expects-json/Config.in        |  9 +++++
 .../python-flask-expects-json.hash                 |  5 +++
 .../python-flask-expects-json.mk                   | 14 ++++++++
 .../package/sample_python_flask_expects_json.py    | 18 ++++++++++
 .../package/test_python_flask_expects_json.py      | 38 ++++++++++++++++++++++
 7 files changed, 91 insertions(+)

diff --git a/DEVELOPERS b/DEVELOPERS
index f22a1c4976..6ffe20426b 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -1982,10 +1982,13 @@ N:	Nicolas Carrier <nicolas.carrier at orolia.com>
 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 <nicolas.cavallari at green-communications.fr>
 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 <timo.ketola at exertus.fi>
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']
+}
+
+
+ at app.route('/', methods=['POST'])
+ at 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)


More information about the buildroot mailing list