diff --git a/jupyterhub/apihandlers/users.py b/jupyterhub/apihandlers/users.py index a7689513..5a7cf71a 100644 --- a/jupyterhub/apihandlers/users.py +++ b/jupyterhub/apihandlers/users.py @@ -5,9 +5,14 @@ import asyncio import inspect import json +import sys from datetime import timedelta, timezone -from async_generator import aclosing +if sys.version_info >= (3, 10): + from contextlib import aclosing +else: + from async_generator import aclosing + from dateutil.parser import parse as parse_date from sqlalchemy import func, or_ from sqlalchemy.orm import joinedload, raiseload, selectinload # noqa diff --git a/jupyterhub/spawner.py b/jupyterhub/spawner.py index 392d67e8..7cc83576 100644 --- a/jupyterhub/spawner.py +++ b/jupyterhub/spawner.py @@ -18,7 +18,11 @@ from tempfile import mkdtemp from textwrap import dedent from urllib.parse import urlparse -from async_generator import aclosing +if sys.version_info >= (3, 10): + from contextlib import aclosing +else: + from async_generator import aclosing + from sqlalchemy import inspect from tornado.ioloop import PeriodicCallback from traitlets import ( diff --git a/jupyterhub/tests/test_services.py b/jupyterhub/tests/test_services.py index 389b7930..9c41c422 100644 --- a/jupyterhub/tests/test_services.py +++ b/jupyterhub/tests/test_services.py @@ -3,10 +3,9 @@ import os import sys from binascii import hexlify +from contextlib import asynccontextmanager from subprocess import Popen -from async_generator import asynccontextmanager - from ..utils import ( exponential_backoff, maybe_future, diff --git a/jupyterhub/tests/test_utils.py b/jupyterhub/tests/test_utils.py index 8b96fb36..7d17b1dc 100644 --- a/jupyterhub/tests/test_utils.py +++ b/jupyterhub/tests/test_utils.py @@ -1,12 +1,17 @@ """Tests for utilities""" import asyncio +import sys import time from concurrent.futures import ThreadPoolExecutor from unittest.mock import Mock +if sys.version_info >= (3, 10): + from contextlib import aclosing +else: + from async_generator import aclosing + import pytest -from async_generator import aclosing from tornado import gen from tornado.concurrent import run_on_executor from tornado.httpserver import HTTPRequest diff --git a/jupyterhub/utils.py b/jupyterhub/utils.py index 6a9ee8c2..694b1088 100644 --- a/jupyterhub/utils.py +++ b/jupyterhub/utils.py @@ -27,8 +27,12 @@ from hmac import compare_digest from operator import itemgetter from urllib.parse import quote +if sys.version_info >= (3, 10): + from contextlib import aclosing +else: + from async_generator import aclosing + import idna -from async_generator import aclosing from sqlalchemy.exc import SQLAlchemyError from tornado import gen, ioloop, web from tornado.httpclient import AsyncHTTPClient, HTTPError diff --git a/requirements.txt b/requirements.txt index 80b9c469..2a8a28ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ alembic>=1.4 -async_generator>=1.9 +async_generator>=1.9; python_version < '3.10' certipy>=0.1.2 idna importlib_metadata>=3.6; python_version < '3.10'