Skip to content

Commit

Permalink
Adjust supported framework versions, add support for Python 3.11 (#76)
Browse files Browse the repository at this point in the history
- Adjusted Flask support (`>=2.0,<2.3`)
- Adjusted Sanic support (`>=21,<23`)
- added support for Django 4.2
- validated Python 3.11 compatibility
- make code changes to account for new framework support
- alphabetized author list
- updated changelog
  • Loading branch information
grahamalama committed Aug 2, 2023
1 parent f9da1eb commit 3a774d1
Show file tree
Hide file tree
Showing 25 changed files with 118 additions and 187 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ['3.7', '3.8', '3.9', '3.10']
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']

# Service containers to run with `container-job`
services:
Expand Down
3 changes: 2 additions & 1 deletion AUTHORS.rst
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
- Peter Bengtsson (@peterbe)
- Graham Beckley (@grahamalama)
- Mike Cooper (@mythmon)
- Will Kahn-Greene (@willkg)
- Michael Kelly (@Osmose)
- Jannis Leidel (@jezdez)
- Les Orchard (@lmorchard)
- Mathieu Leplatre (@leplatrem)
- Les Orchard (@lmorchard)
- Mathieu Pillard (@diox)
11 changes: 11 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
Changelog
---------

2023.8.0
~~~~~~~~~~~~~~~~~~~~~

- Add support for Django 4.2

- Drop support for Sanic 20

- Drop support for Flask 0.12, 1.0, and 1.1

- Add support for Python 3.11

2022.8.0 (2022-08-18)
~~~~~~~~~~~~~~~~~~~~~

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.black]
line-length = 88
target-version = ['py37', 'py38', 'py39', 'py310']
target-version = ['py37', 'py38', 'py39', 'py310', 'py311']
include = '\.pyi?$'
exclude = '''
/(
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def read(*parts):
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Topic :: Internet :: WWW/HTTP",
],
extras_require={
Expand Down
22 changes: 2 additions & 20 deletions src/dockerflow/django/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,10 @@
import time
import uuid

from django import VERSION
from django.utils.deprecation import MiddlewareMixin

from . import views

try:
from django.utils.deprecation import MiddlewareMixin
except ImportError: # pragma: no cover
MiddlewareMixin = object


# Computed once, reused in every request
_less_than_django_1_10 = VERSION < (1, 10)


def is_authenticated(user): # pragma: no cover
"""Check if the user is authenticated but do it in a way that
it doesnt' cause a DeprecationWarning in Django >=1.10"""
if _less_than_django_1_10:
# Prior to Django 1.10, user.is_authenticated was a method
return user.is_authenticated()
return user.is_authenticated


class DockerflowMiddleware(MiddlewareMixin):
"""
Expand Down Expand Up @@ -66,7 +48,7 @@ def _build_extra_meta(self, request):
# modified earlier, so be sure to check for existence of these
# attributes before trying to use them.
if hasattr(request, "user"):
out["uid"] = is_authenticated(request.user) and request.user.pk or ""
out["uid"] = request.user.is_authenticated and request.user.pk or ""
if hasattr(request, "_id"):
out["rid"] = request._id
if hasattr(request, "_start_timestamp"):
Expand Down
4 changes: 3 additions & 1 deletion src/dockerflow/flask/checks/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
"""
This module contains a few built-in checks for the Flask integration.
"""
from sqlalchemy import text

from ... import health
from ...checks import ( # noqa
CRITICAL,
Expand Down Expand Up @@ -47,7 +49,7 @@ def check_database_connected(db):
errors = []
try:
with db.engine.connect() as connection:
connection.execute("SELECT 1;")
connection.execute(text("SELECT 1;"))
except DBAPIError as e:
msg = "DB-API error: {!s}".format(e)
errors.append(Error(msg, id=health.ERROR_DB_API_EXCEPTION))
Expand Down
1 change: 0 additions & 1 deletion src/dockerflow/sanic/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ def __init__(
*args,
**kwargs,
):

# The Dockerflow specific logger to be used by internals of this
# extension.
self.logger = logging.getLogger("dockerflow.sanic")
Expand Down
15 changes: 5 additions & 10 deletions src/dockerflow/sanic/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
)


async def check_redis_connected(redis):
async def check_redis_connected(redis_client):
"""
A built-in check to connect to Redis using the given client and see
if it responds to the ``PING`` command.
Expand Down Expand Up @@ -54,22 +54,17 @@ async def check_redis_connected(redis):
dockerflow = Dockerflow(app, redis=redis)
"""
import aioredis

if aioredis.__version__.startswith("1."):
RedisConnectionError = aioredis.ConnectionClosedError
else:
RedisConnectionError = aioredis.ConnectionError
import redis

errors = []

try:
with await redis.conn as r:
with await redis_client.conn as r:
result = await r.ping()
except RedisConnectionError as e:
except redis.ConnectionError as e:
msg = "Could not connect to redis: {!s}".format(e)
errors.append(Error(msg, id=health.ERROR_CANNOT_CONNECT_REDIS))
except aioredis.RedisError as e:
except redis.RedisError as e:
errors.append(
Error('Redis error: "{!s}"'.format(e), id=health.ERROR_REDIS_EXCEPTION)
)
Expand Down
1 change: 1 addition & 0 deletions tests/constraints/django-4.2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Django>=4.2,<4.3
4 changes: 0 additions & 4 deletions tests/constraints/flask-0.12.txt

This file was deleted.

4 changes: 0 additions & 4 deletions tests/constraints/flask-1.0.txt

This file was deleted.

2 changes: 0 additions & 2 deletions tests/constraints/flask-1.1.txt

This file was deleted.

2 changes: 2 additions & 0 deletions tests/constraints/flask-2.0.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
Flask<2.1
Werkzeug<2.1.0
SQLAlchemy<=1.4
Flask-SQLAlchemy<3.0
2 changes: 2 additions & 0 deletions tests/constraints/flask-2.1.txt
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
Flask<2.2
SQLAlchemy<=1.4
Flask-SQLAlchemy<3.0
3 changes: 0 additions & 3 deletions tests/constraints/sanic-20.txt

This file was deleted.

2 changes: 2 additions & 0 deletions tests/constraints/sanic-21.txt
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
Sanic>=21,<22
websockets<11
sanic-testing<22
6 changes: 1 addition & 5 deletions tests/django/test_django.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,12 @@
from django.db.utils import OperationalError, ProgrammingError
from django.http import HttpResponse
from django.test.utils import CaptureQueriesContext
from django.utils.deprecation import MiddlewareMixin

from dockerflow import health
from dockerflow.django import checks
from dockerflow.django.middleware import DockerflowMiddleware

try:
from django.utils.deprecation import MiddlewareMixin
except ImportError: # pragma: no cover
MiddlewareMixin = object


@pytest.fixture
def reset_checks():
Expand Down
Loading

0 comments on commit 3a774d1

Please sign in to comment.