diff --git a/language_tool_python/__main__.py b/language_tool_python/__main__.py index 09b068a..b94ccb9 100644 --- a/language_tool_python/__main__.py +++ b/language_tool_python/__main__.py @@ -14,8 +14,7 @@ from pathlib import Path from typing import TYPE_CHECKING, cast -import toml - +from ._compat import toml_loads from .exceptions import LanguageToolError from .server import LanguageTool @@ -30,7 +29,7 @@ project_root = Path(__file__).resolve().parent.parent pyproject = project_root / "pyproject.toml" with pyproject.open("rb") as f: - __version__ = toml.loads(f.read().decode("utf-8"))["project"]["version"] + __version__ = toml_loads(f.read().decode("utf-8"))["project"]["version"] logger = logging.getLogger(__name__) @@ -40,7 +39,7 @@ ) as config_path, config_path.open("rb") as f, ): - log_config = toml.loads(f.read().decode("utf-8")) + log_config = toml_loads(f.read().decode("utf-8")) dictConfig(log_config) diff --git a/language_tool_python/_compat.py b/language_tool_python/_compat.py new file mode 100644 index 0000000..5baad9d --- /dev/null +++ b/language_tool_python/_compat.py @@ -0,0 +1,23 @@ +"""Compatibility helpers for Python-version-dependent imports. + +This module centralizes the fallback imports used across the package: + +- ``deprecated``: built-in ``warnings.deprecated`` on Python 3.13+, otherwise + ``typing_extensions.deprecated``. +- ``toml_loads``: built-in ``tomllib.loads`` on Python 3.11+, otherwise +``tomli.loads``. +""" + +import sys + +if sys.version_info >= (3, 11): + from tomllib import loads as toml_loads +else: + from tomli import loads as toml_loads + +if sys.version_info >= (3, 13): + from warnings import deprecated +else: + from typing_extensions import deprecated + +__all__ = ["deprecated", "toml_loads"] diff --git a/language_tool_python/_deprecated.py b/language_tool_python/_deprecated.py deleted file mode 100644 index 0d772c1..0000000 --- a/language_tool_python/_deprecated.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Provide a deprecated decorator for marking functions or classes as deprecated. - -If the Python version is 3.13 or higher, it uses the -built-in ``warnings.deprecated`` decorator. -If the Python version is lower than 3.13, it falls back to using the -``typing_extensions.deprecated`` decorator. -""" - -import sys - -if sys.version_info >= (3, 13): - from warnings import deprecated -else: - from typing_extensions import deprecated - -__all__ = ["deprecated"] diff --git a/language_tool_python/download_lt.py b/language_tool_python/download_lt.py index 5e875a5..5defef8 100755 --- a/language_tool_python/download_lt.py +++ b/language_tool_python/download_lt.py @@ -21,12 +21,11 @@ from warnings import warn import requests -import toml import tqdm from packaging import version from packaging.version import Version -from ._deprecated import deprecated +from ._compat import deprecated, toml_loads from .exceptions import JavaError, PathError from .safe_zip import SafeZipExtractor from .utils import ( @@ -83,7 +82,7 @@ ) as hashes_path, hashes_path.open("rb") as f, ): - EXPECTED_DOWNLOAD_SHA256 = toml.loads(f.read().decode("utf-8")) + EXPECTED_DOWNLOAD_SHA256 = toml_loads(f.read().decode("utf-8")) JAVA_VERSION_REGEX = re.compile( r'^(?:java|openjdk) version "(?P\d+)(|\.(?P\d+)\.[^"]+)"', diff --git a/language_tool_python/match.py b/language_tool_python/match.py index f111e94..abd239f 100644 --- a/language_tool_python/match.py +++ b/language_tool_python/match.py @@ -9,7 +9,7 @@ from functools import total_ordering from typing import TYPE_CHECKING -from ._deprecated import deprecated +from ._compat import deprecated from .utils import SupportsFloat, SupportsInt if TYPE_CHECKING: diff --git a/language_tool_python/utils.py b/language_tool_python/utils.py index 87f117f..38e41b5 100644 --- a/language_tool_python/utils.py +++ b/language_tool_python/utils.py @@ -17,7 +17,7 @@ import psutil from packaging import version -from ._deprecated import deprecated +from ._compat import deprecated from .exceptions import JavaError, PathError if TYPE_CHECKING: diff --git a/pyproject.toml b/pyproject.toml index 59a584a..4c208b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "tqdm", "packaging", "psutil", - "toml", + "tomli; python_version < '3.11'", # only needed for py < 3.11 because tomllib added in 3.11 is used in the codebase, needs a fallback "typing_extensions; python_version < '3.13'", # only needed for py < 3.13 because warnings.deprecated added in 3.13 is used in the codebase ] diff --git a/tests/test_deprecated.py b/tests/test_deprecated.py index 299ef8a..4deebd8 100644 --- a/tests/test_deprecated.py +++ b/tests/test_deprecated.py @@ -4,7 +4,7 @@ import warnings -from language_tool_python._deprecated import deprecated +from language_tool_python._compat import deprecated EXPECTED_CUSTOM_WARNING_RESULT = 42 EXPECTED_FUNCTION_SUM = 5 diff --git a/uv.lock b/uv.lock index 4eaed9f..717856d 100644 --- a/uv.lock +++ b/uv.lock @@ -646,7 +646,7 @@ dependencies = [ { name = "psutil" }, { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "toml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tqdm" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] @@ -686,7 +686,7 @@ requires-dist = [ { name = "packaging" }, { name = "psutil" }, { name = "requests" }, - { name = "toml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tqdm" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] @@ -1419,15 +1419,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] -[[package]] -name = "toml" -version = "0.10.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, -] - [[package]] name = "tomli" version = "2.4.1"