From 83cac49058fdb047d832ba451da32255a9989fa9 Mon Sep 17 00:00:00 2001 From: Aaron Gibson Date: Tue, 28 Oct 2025 07:12:43 +0000 Subject: [PATCH 1/5] Update build_runner to debian stable (trixie) --- api/Dockerfile | 2 +- api/build_runner.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/Dockerfile b/api/Dockerfile index fadb56169..ec4e4568c 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye +FROM debian:trixie ENV PYTHONUNBUFFERED 1 ENV PYTHONPATH /app/ ENV DEBIAN_FRONTEND noninteractive diff --git a/api/build_runner.sh b/api/build_runner.sh index 1cc58c7fb..b8637e619 100755 --- a/api/build_runner.sh +++ b/api/build_runner.sh @@ -7,7 +7,7 @@ set -eu export DEBIAN_FRONTEND=noninteractive -echo 'deb http://deb.debian.org/debian bullseye-backports main' \ +echo 'deb http://deb.debian.org/debian trixie-backports main' \ > /etc/apt/sources.list.d/backports.list # Install ca-certificates and gnupg first From ebbe9b8b559cdfb70a6c14ac8b8900c8f4b9c318 Mon Sep 17 00:00:00 2001 From: Aaron Gibson Date: Tue, 28 Oct 2025 09:08:48 +0000 Subject: [PATCH 2/5] use python builtin json.JSONEncoder; deprecated in Flask --- api/ooniapi/app.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/ooniapi/app.py b/api/ooniapi/app.py index be72ff764..67105c431 100644 --- a/api/ooniapi/app.py +++ b/api/ooniapi/app.py @@ -3,11 +3,12 @@ import datetime import logging import os +import json import re import sys from collections import deque -from flask import Flask, json +from flask import Flask from flask_cors import CORS # debdeps: python3-flask-cors @@ -32,7 +33,7 @@ APP_DIR = os.path.dirname(__file__) -class FlaskJSONEncoder(json.JSONEncoder): +class JSONEncoderWithDates(json.JSONEncoder): # Special JSON encoder that handles dates def default(self, o): if isinstance(o, datetime.datetime): @@ -176,7 +177,7 @@ def create_app(*args, testmode=False, **kw): from ooniapi import views app = Flask(__name__) - app.json_encoder = FlaskJSONEncoder + app.json_encoder = JSONEncoderWithDates # Order matters init_app(app, testmode=testmode) From a2de01592668653ea4c80971b9dd6ee3ccc72a70 Mon Sep 17 00:00:00 2001 From: Aaron Gibson Date: Tue, 28 Oct 2025 09:20:09 +0000 Subject: [PATCH 3/5] update pytest.yield_fixture to pytest.fixture as former is deprecated --- api/tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/tests/conftest.py b/api/tests/conftest.py index d0e70a701..c749c50ad 100644 --- a/api/tests/conftest.py +++ b/api/tests/conftest.py @@ -28,7 +28,7 @@ def app(): return app -@pytest.yield_fixture +@pytest.fixture def client(app): """ Overriding the `client` fixture from pytest_flask to fix this bug: From 9348b6440cdf431f62bb6dd300efcdc85a353e71 Mon Sep 17 00:00:00 2001 From: Aaron Gibson Date: Tue, 28 Oct 2025 09:30:02 +0000 Subject: [PATCH 4/5] update deprecated sqlalchemy.ext.declarative.declarative_base this is now available as sqlalchemy.orm.declarative_base --- api/ooniapi/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/ooniapi/database.py b/api/ooniapi/database.py index 7af933923..d5250a271 100644 --- a/api/ooniapi/database.py +++ b/api/ooniapi/database.py @@ -6,7 +6,7 @@ from flask import current_app from sqlalchemy.dialects import postgresql -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import declarative_base from sqlalchemy.sql.elements import TextClause from sqlalchemy.sql.selectable import Select From f37102d9f8a001e03c778cc956797d676209dde4 Mon Sep 17 00:00:00 2001 From: Aaron Gibson Date: Tue, 28 Oct 2025 10:00:30 +0000 Subject: [PATCH 5/5] override references deprecated name and issue #42 is not a bug --- api/tests/conftest.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/api/tests/conftest.py b/api/tests/conftest.py index c749c50ad..2cc59f5f4 100644 --- a/api/tests/conftest.py +++ b/api/tests/conftest.py @@ -37,12 +37,13 @@ def client(app): with app.test_client() as client: yield client - while True: - top = flask._request_ctx_stack.top - if top is not None and top.preserved: - top.pop() - else: - break + # deprecated name _request_ctx_stack and marked as not a bug on issue #42 + #while True: + # top = flask._request_ctx_stack.top + # if top is not None and top.preserved: + # top.pop() + # else: + # break @pytest.fixture(autouse=True)