diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ecf2a75..c36c9a30 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,11 +41,11 @@ jobs: fail-fast: false matrix: python: [ - "3.8", "3.9", "3.10", "3.11", "3.12", + "3.13", "pypy-3.9", "pypy-3.10", ] @@ -57,11 +57,11 @@ jobs: ] include: # Test with older Trino versions for backward compatibility - - { python: "3.12", trino: "351", sqlalchemy: "~=1.4.0" } # first Trino version + - { python: "3.13", trino: "351", sqlalchemy: "~=1.4.0" } # first Trino version # Test with sqlalchemy 1.3 - - { python: "3.12", trino: "latest", sqlalchemy: "~=1.3.0" } + - { python: "3.13", trino: "latest", sqlalchemy: "~=1.3.0" } # Test with sqlalchemy 2.0 - - { python: "3.12", trino: "latest", sqlalchemy: "~=2.0.0" } + - { python: "3.13", trino: "latest", sqlalchemy: "~=2.0.0" } env: TRINO_VERSION: "${{ matrix.trino }}" steps: diff --git a/README.md b/README.md index 98cd44f5..3c911e4e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Client for [Trino](https://trino.io/), a distributed SQL engine for interactive and batch big data processing. Provides a low-level client and a DBAPI 2.0 implementation and a SQLAlchemy adapter. -It supports Python>=3.8 and PyPy. +It supports Python>=3.9 and PyPy. [![Build Status](https://github.com/trinodb/trino-python-client/workflows/ci/badge.svg)](https://github.com/trinodb/trino-python-client/actions?query=workflow%3Aci+event%3Apush+branch%3Amaster) [![Trino Slack](https://img.shields.io/static/v1?logo=slack&logoColor=959DA5&label=Slack&labelColor=333a41&message=join%20conversation&color=3AC358)](https://trino.io/slack.html) diff --git a/setup.py b/setup.py index fcd7cf5c..65fa9605 100755 --- a/setup.py +++ b/setup.py @@ -70,18 +70,17 @@ "Operating System :: Microsoft :: Windows", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database :: Front-Ends", ], - python_requires=">=3.8", + python_requires=">=3.9", install_requires=[ - "backports.zoneinfo;python_version<'3.9'", "python-dateutil", "pytz", # requests CVE https://github.com/advisories/GHSA-j8r2-6x86-q33q diff --git a/tests/integration/test_dbapi_integration.py b/tests/integration/test_dbapi_integration.py index 73478443..5cd77d16 100644 --- a/tests/integration/test_dbapi_integration.py +++ b/tests/integration/test_dbapi_integration.py @@ -15,11 +15,7 @@ from datetime import date, datetime, time, timedelta, timezone from decimal import Decimal from typing import Tuple - -try: - from zoneinfo import ZoneInfo -except ModuleNotFoundError: - from backports.zoneinfo import ZoneInfo +from zoneinfo import ZoneInfo import pytest import requests diff --git a/tests/integration/test_types_integration.py b/tests/integration/test_types_integration.py index 09611d30..dc8fe683 100644 --- a/tests/integration/test_types_integration.py +++ b/tests/integration/test_types_integration.py @@ -3,11 +3,7 @@ import uuid from datetime import date, datetime, time, timedelta, timezone, tzinfo from decimal import Decimal - -try: - from zoneinfo import ZoneInfo -except ModuleNotFoundError: - from backports.zoneinfo import ZoneInfo +from zoneinfo import ZoneInfo import pytest diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index b2ac31b1..82e19a0f 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -18,6 +18,7 @@ from typing import Any, Dict, Optional from unittest import TestCase, mock from urllib.parse import urlparse +from zoneinfo import ZoneInfoNotFoundError import gssapi import httpretty @@ -59,11 +60,6 @@ _RetryWithExponentialBackoff, ) -try: - from zoneinfo import ZoneInfoNotFoundError # type: ignore -except ModuleNotFoundError: - from backports.zoneinfo._common import ZoneInfoNotFoundError # type: ignore - @mock.patch("trino.client.TrinoRequest.http") def test_trino_initial_request(mock_requests, sample_post_response_data): diff --git a/tox.ini b/tox.ini index 19f05364..0db8fbe6 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py37,py38,py39,py310,py311 +envlist = py39,py310,py311,py312,py313 [testenv] extras = tests diff --git a/trino/client.py b/trino/client.py index 4fea8321..61db9444 100644 --- a/trino/client.py +++ b/trino/client.py @@ -47,13 +47,7 @@ from email.utils import parsedate_to_datetime from time import sleep from typing import Any, Dict, List, Optional, Tuple, Union - -from trino.mapper import RowMapper, RowMapperFactory - -try: - from zoneinfo import ZoneInfo -except ModuleNotFoundError: - from backports.zoneinfo import ZoneInfo +from zoneinfo import ZoneInfo import requests from tzlocal import get_localzone_name # type: ignore @@ -61,6 +55,7 @@ import trino.logging from trino import constants, exceptions from trino._version import __version__ +from trino.mapper import RowMapper, RowMapperFactory __all__ = ["ClientSession", "TrinoQuery", "TrinoRequest", "PROXIES"] diff --git a/trino/dbapi.py b/trino/dbapi.py index 9125a487..4f3dfdc6 100644 --- a/trino/dbapi.py +++ b/trino/dbapi.py @@ -27,11 +27,7 @@ from time import time from typing import Any, Dict, List, NamedTuple, Optional # NOQA for mypy types from urllib.parse import urlparse - -try: - from zoneinfo import ZoneInfo -except ModuleNotFoundError: - from backports.zoneinfo import ZoneInfo +from zoneinfo import ZoneInfo import trino.client import trino.exceptions diff --git a/trino/mapper.py b/trino/mapper.py index 48a905a6..b56037d7 100644 --- a/trino/mapper.py +++ b/trino/mapper.py @@ -2,16 +2,11 @@ import abc import base64 -import sys import uuid from datetime import date, datetime, time, timedelta, timezone, tzinfo from decimal import Decimal from typing import Any, Dict, Generic, List, Optional, Tuple, TypeVar - -if sys.version_info >= (3, 9): - from zoneinfo import ZoneInfo -else: - from backports.zoneinfo import ZoneInfo +from zoneinfo import ZoneInfo import trino.exceptions from trino.types import (