From fc680a8a71db694e4858cc84af7a2dbfec374f13 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 04:16:55 +0800 Subject: [PATCH 01/12] drop python 35 36 --- .github/workflows/tests.yml | 4 ---- pyproject.toml | 8 ++------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 047a26f82..0acfc360f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,10 +26,6 @@ jobs: # - 3.13-dev - pypy-3.9 include: - - os: ubuntu-20.04 - python-version: '3.5' - - os: ubuntu-20.04 - python-version: '3.6' - os: windows-2022 python-version: '3.12' - os: macos-13 diff --git a/pyproject.toml b/pyproject.toml index 76b76210c..722489ee9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,8 +15,6 @@ classifiers = [ "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", @@ -30,7 +28,6 @@ classifiers = [ ] dependencies = [ "colorama>=0.3.4 ; sys_platform=='win32'", - "aiocontextvars>=0.2.0 ; python_version<'3.7'", "win32-setctime>=1.0.0 ; sys_platform=='win32'" ] description = "Python logging made (stupidly) simple" @@ -52,7 +49,7 @@ dev = [ "pytest==8.2.1 ; python_version>='3.8'", "pytest-cov==2.12.1 ; python_version<'3.8'", "pytest-cov==5.0.0 ; python_version>='3.8'", - "pytest-mypy-plugins==1.9.3 ; python_version>='3.6' and python_version<'3.8'", + "pytest-mypy-plugins==1.9.3 ; python_version<'3.8'", "pytest-mypy-plugins==3.1.0 ; python_version>='3.8'", # Testing utils. "colorama==0.4.5 ; python_version<'3.8'", @@ -61,8 +58,7 @@ dev = [ "freezegun==1.5.0 ; python_version>='3.8'", "exceptiongroup==1.1.3 ; python_version>='3.7' and python_version<'3.11'", # Type checking. - "mypy==v0.910 ; python_version<'3.6'", - "mypy==v0.971 ; python_version>='3.6' and python_version<'3.7'", + "mypy==v0.971 ; python_version<'3.7'", "mypy==v1.4.1 ; python_version>='3.7' and python_version<'3.8'", "mypy==v1.10.0 ; python_version>='3.8'", # Docs. From dfd5183dd257c48e6139603b4b8b20dd71e7ddb4 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 04:19:03 +0800 Subject: [PATCH 02/12] bump --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 722489ee9..311aa39f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ keywords = ["loguru", "logging", "logger", "log"] license = {text = "MIT"} name = "loguru" readme = 'README.rst' -requires-python = ">=3.5,<4.0" +requires-python = ">=3.7,<4.0" [project.optional-dependencies] dev = [ @@ -75,7 +75,7 @@ Homepage = "https://github.com/Delgan/loguru" [tool.black] force-exclude = "tests/exceptions/source/modern/*" line-length = 100 -target-version = ["py35"] +target-version = ["py37"] [tool.flit.module] name = "loguru" From 937bd9debe3ebfc6380771557073d21f39a824f1 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 04:21:30 +0800 Subject: [PATCH 03/12] run black --- loguru/__init__.pyi | 16 ++++++++-------- loguru/_file_sink.py | 2 +- loguru/_handler.py | 2 +- loguru/_logger.py | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/loguru/__init__.pyi b/loguru/__init__.pyi index 101629148..66c958859 100644 --- a/loguru/__init__.pyi +++ b/loguru/__init__.pyi @@ -248,7 +248,7 @@ class Logger: diagnose: bool = ..., enqueue: bool = ..., context: Optional[Union[str, BaseContext]] = ..., - catch: bool = ... + catch: bool = ..., ) -> int: ... @overload def add( @@ -265,7 +265,7 @@ class Logger: enqueue: bool = ..., context: Optional[Union[str, BaseContext]] = ..., catch: bool = ..., - loop: Optional[AbstractEventLoop] = ... + loop: Optional[AbstractEventLoop] = ..., ) -> int: ... @overload def add( @@ -290,7 +290,7 @@ class Logger: mode: str = ..., buffering: int = ..., encoding: str = ..., - **kwargs: Any + **kwargs: Any, ) -> int: ... def remove(self, handler_id: Optional[int] = ...) -> None: ... def complete(self) -> AwaitableCompleter: ... @@ -304,7 +304,7 @@ class Logger: onerror: Optional[Callable[[BaseException], None]] = ..., exclude: Optional[Union[Type[BaseException], Tuple[Type[BaseException], ...]]] = ..., default: Any = ..., - message: str = ... + message: str = ..., ) -> Catcher: ... @overload def catch(self, function: _F) -> _F: ... @@ -318,7 +318,7 @@ class Logger: raw: bool = ..., capture: bool = ..., depth: int = ..., - ansi: bool = ... + ansi: bool = ..., ) -> Logger: ... def bind(__self, **kwargs: Any) -> Logger: ... # noqa: N805 def contextualize(__self, **kwargs: Any) -> Contextualizer: ... # noqa: N805 @@ -346,7 +346,7 @@ class Logger: levels: Optional[Sequence[LevelConfig]] = ..., extra: Optional[Dict[Any, Any]] = ..., patcher: Optional[PatcherFunction] = ..., - activation: Optional[Sequence[ActivationConfig]] = ... + activation: Optional[Sequence[ActivationConfig]] = ..., ) -> List[int]: ... # @staticmethod cannot be used with @overload in mypy (python/mypy#7781). # However Logger is not exposed and logger is an instance of Logger @@ -359,7 +359,7 @@ class Logger: pattern: Union[str, Pattern[str]], *, cast: Union[Dict[str, Callable[[str], Any]], Callable[[Dict[str, str]], None]] = ..., - chunk: int = ... + chunk: int = ..., ) -> Generator[Dict[str, Any], None, None]: ... @overload def parse( @@ -368,7 +368,7 @@ class Logger: pattern: Union[bytes, Pattern[bytes]], *, cast: Union[Dict[str, Callable[[bytes], Any]], Callable[[Dict[str, bytes]], None]] = ..., - chunk: int = ... + chunk: int = ..., ) -> Generator[Dict[str, Any], None, None]: ... @overload def trace(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 diff --git a/loguru/_file_sink.py b/loguru/_file_sink.py index 4b09b06bb..e8f48eea6 100644 --- a/loguru/_file_sink.py +++ b/loguru/_file_sink.py @@ -167,7 +167,7 @@ def __init__( mode="a", buffering=1, encoding="utf8", - **kwargs + **kwargs, ): self.encoding = encoding diff --git a/loguru/_handler.py b/loguru/_handler.py index 81a3dca08..48e86cab0 100644 --- a/loguru/_handler.py +++ b/loguru/_handler.py @@ -45,7 +45,7 @@ def __init__( error_interceptor, exception_formatter, id_, - levels_ansi_codes + levels_ansi_codes, ): self._name = name self._sink = sink diff --git a/loguru/_logger.py b/loguru/_logger.py index cc514b083..3facbf417 100644 --- a/loguru/_logger.py +++ b/loguru/_logger.py @@ -249,7 +249,7 @@ def add( enqueue=_defaults.LOGURU_ENQUEUE, context=_defaults.LOGURU_CONTEXT, catch=_defaults.LOGURU_CATCH, - **kwargs + **kwargs, ): r"""Add a handler sending log messages to a sink adequately configured. @@ -1136,7 +1136,7 @@ def catch( default=None, message="An error has been caught in function '{record[function]}', " "process '{record[process].name}' ({record[process].id}), " - "thread '{record[thread].name}' ({record[thread].id}):" + "thread '{record[thread].name}' ({record[thread].id}):", ): """Return a decorator to automatically log possibly caught error in wrapped function. @@ -1293,7 +1293,7 @@ def opt( raw=False, capture=True, depth=0, - ansi=False + ansi=False, ): r"""Parametrize a logging call to slightly change generated log message. From 245b139b9075545844255d5d1604447f2185d8c3 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 04:47:14 +0800 Subject: [PATCH 04/12] upgrade --- loguru/_asyncio_loop.py | 27 --------------------------- loguru/_contextvars.py | 15 --------------- loguru/_file_sink.py | 6 +++--- loguru/_logger.py | 20 +++++++++++--------- loguru/_recattrs.py | 12 +++++++----- loguru/_simple_sinks.py | 5 ++--- tests/conftest.py | 29 ----------------------------- tests/test_contextualize.py | 12 ------------ tests/test_datetime.py | 5 +---- tests/test_filesink_retention.py | 2 +- tests/test_repr.py | 9 ++------- 11 files changed, 27 insertions(+), 115 deletions(-) delete mode 100644 loguru/_asyncio_loop.py delete mode 100644 loguru/_contextvars.py diff --git a/loguru/_asyncio_loop.py b/loguru/_asyncio_loop.py deleted file mode 100644 index e981955c7..000000000 --- a/loguru/_asyncio_loop.py +++ /dev/null @@ -1,27 +0,0 @@ -import asyncio -import sys - - -def load_loop_functions(): - if sys.version_info >= (3, 7): - - def get_task_loop(task): - return task.get_loop() - - get_running_loop = asyncio.get_running_loop - - else: - - def get_task_loop(task): - return task._loop - - def get_running_loop(): - loop = asyncio.get_event_loop() - if not loop.is_running(): - raise RuntimeError("There is no running event loop") - return loop - - return get_task_loop, get_running_loop - - -get_task_loop, get_running_loop = load_loop_functions() diff --git a/loguru/_contextvars.py b/loguru/_contextvars.py deleted file mode 100644 index 2e8bbb292..000000000 --- a/loguru/_contextvars.py +++ /dev/null @@ -1,15 +0,0 @@ -import sys - - -def load_contextvar_class(): - if sys.version_info >= (3, 7): - from contextvars import ContextVar - elif sys.version_info >= (3, 5, 3): - from aiocontextvars import ContextVar - else: - from contextvars import ContextVar - - return ContextVar - - -ContextVar = load_contextvar_class() diff --git a/loguru/_file_sink.py b/loguru/_file_sink.py index e8f48eea6..7225064d2 100644 --- a/loguru/_file_sink.py +++ b/loguru/_file_sink.py @@ -17,12 +17,12 @@ def generate_rename_path(root, ext, creation_time): creation_datetime = datetime.datetime.fromtimestamp(creation_time) date = FileDateFormatter(creation_datetime) - renamed_path = "{}.{}{}".format(root, date, ext) + renamed_path = f"{root}.{date}{ext}" counter = 1 while os.path.exists(renamed_path): counter += 1 - renamed_path = "{}.{}.{}{}".format(root, date, counter, ext) + renamed_path = f"{root}.{date}.{counter}{ext}" return renamed_path @@ -56,7 +56,7 @@ def copy_compress(path_in, path_out, opener, **kwargs): @staticmethod def compression(path_in, ext, compress_function): - path_out = "{}{}".format(path_in, ext) + path_out = f"{path_in}{ext}" if os.path.exists(path_out): creation_time = get_ctime(path_out) diff --git a/loguru/_logger.py b/loguru/_logger.py index 3facbf417..ed271786f 100644 --- a/loguru/_logger.py +++ b/loguru/_logger.py @@ -90,17 +90,19 @@ import re import sys import warnings -from collections import namedtuple +from asyncio import get_running_loop +from contextvars import ContextVar from inspect import isclass, iscoroutinefunction, isgeneratorfunction from multiprocessing import current_process, get_context from multiprocessing.context import BaseContext +from os import PathLike from os.path import basename, splitext from threading import current_thread +from typing import NamedTuple -from . import _asyncio_loop, _colorama, _defaults, _filters +from . import _colorama, _defaults, _filters from ._better_exceptions import ExceptionFormatter from ._colorizer import Colorizer -from ._contextvars import ContextVar from ._datetime import aware_now from ._error_interceptor import ErrorInterceptor from ._file_sink import FileSink @@ -110,13 +112,13 @@ from ._recattrs import RecordException, RecordFile, RecordLevel, RecordProcess, RecordThread from ._simple_sinks import AsyncSink, CallableSink, StandardSink, StreamSink -if sys.version_info >= (3, 6): - from os import PathLike -else: - from pathlib import PurePath as PathLike +class Level(NamedTuple): + name: str + no: int + color: str + icon: str -Level = namedtuple("Level", ["name", "no", "color", "icon"]) start_time = aware_now() @@ -840,7 +842,7 @@ def add( # running loop in Python 3.5.2 and earlier versions, see python/asyncio#452. if enqueue and loop is None: try: - loop = _asyncio_loop.get_running_loop() + loop = get_running_loop() except RuntimeError as e: raise ValueError( "An event loop is required to add a coroutine sink with `enqueue=True`, " diff --git a/loguru/_recattrs.py b/loguru/_recattrs.py index b09426efb..820c0c30d 100644 --- a/loguru/_recattrs.py +++ b/loguru/_recattrs.py @@ -11,7 +11,7 @@ def __init__(self, name, no, icon): self.icon = icon def __repr__(self): - return "(name=%r, no=%r, icon=%r)" % (self.name, self.no, self.icon) + return f"(name={self.name!r}, no={self.no!r}, icon={self.icon!r})" def __format__(self, spec): return self.name.__format__(spec) @@ -25,7 +25,7 @@ def __init__(self, name, path): self.path = path def __repr__(self): - return "(name=%r, path=%r)" % (self.name, self.path) + return f"(name={self.name!r}, path={self.path!r})" def __format__(self, spec): return self.name.__format__(spec) @@ -39,7 +39,7 @@ def __init__(self, id_, name): self.name = name def __repr__(self): - return "(id=%r, name=%r)" % (self.id, self.name) + return f"(id={self.id!r}, name={self.name!r})" def __format__(self, spec): return self.id.__format__(spec) @@ -53,7 +53,7 @@ def __init__(self, id_, name): self.name = name def __repr__(self): - return "(id=%r, name=%r)" % (self.id, self.name) + return f"(id={self.id!r}, name={self.name!r})" def __format__(self, spec): return self.id.__format__(spec) @@ -61,7 +61,9 @@ def __format__(self, spec): class RecordException(namedtuple("RecordException", ("type", "value", "traceback"))): def __repr__(self): - return "(type=%r, value=%r, traceback=%r)" % (self.type, self.value, self.traceback) + return "(type={!r}, value={!r}, traceback={!r})".format( + self.type, self.value, self.traceback + ) def __reduce__(self): # The traceback is not picklable, therefore it needs to be removed. Additionally, there's a diff --git a/loguru/_simple_sinks.py b/loguru/_simple_sinks.py index 068f1e13e..b24fac987 100644 --- a/loguru/_simple_sinks.py +++ b/loguru/_simple_sinks.py @@ -1,8 +1,7 @@ import asyncio import logging import weakref - -from ._asyncio_loop import get_running_loop, get_task_loop +from asyncio import get_running_loop class StreamSink: @@ -97,7 +96,7 @@ def tasks_to_complete(self): async def _complete_task(self, task): loop = get_running_loop() - if get_task_loop(task) is not loop: + if task.get_loop() is not loop: return try: await task diff --git a/tests/conftest.py b/tests/conftest.py index 1f044177f..33b7e12c4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,7 +5,6 @@ import io import logging import os -import pathlib import sys import threading import time @@ -18,34 +17,6 @@ import loguru -if sys.version_info < (3, 5, 3): - - def run(coro): - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - res = loop.run_until_complete(coro) - loop.close() - asyncio.set_event_loop(None) - return res - - asyncio.run = run -elif sys.version_info < (3, 7): - - def run(coro): - loop = asyncio.new_event_loop() - res = loop.run_until_complete(coro) - loop.close() - asyncio.set_event_loop(None) - return res - - asyncio.run = run - -if sys.version_info < (3, 6): - - @pytest.fixture - def tmp_path(tmp_path): - yield pathlib.Path(str(tmp_path)) - @contextlib.contextmanager def new_event_loop_context(): diff --git a/tests/test_contextualize.py b/tests/test_contextualize.py index e1a8fe36d..74546d867 100644 --- a/tests/test_contextualize.py +++ b/tests/test_contextualize.py @@ -1,12 +1,10 @@ import asyncio import sys import threading -from unittest.mock import MagicMock import pytest from loguru import logger -from loguru._contextvars import load_contextvar_class def test_contextualize(writer): @@ -209,13 +207,3 @@ def test_context_reset_despite_error(writer): logger.info("Error") assert writer.read() == "Division {'foobar': 456}\nError {}\n" - - -# There is not CI runner available for Python 3.5.2. Consequently, we are just -# verifying third-library is properly imported to reach 100% coverage. -def test_contextvars_fallback_352(monkeypatch): - mock_module = MagicMock() - with monkeypatch.context() as context: - context.setattr(sys, "version_info", (3, 5, 2)) - context.setitem(sys.modules, "contextvars", mock_module) - assert load_contextvar_class() == mock_module.ContextVar diff --git a/tests/test_datetime.py b/tests/test_datetime.py index ff7f6f905..191639443 100644 --- a/tests/test_datetime.py +++ b/tests/test_datetime.py @@ -7,10 +7,7 @@ from loguru import logger -if sys.version_info < (3, 6): - UTC_NAME = "UTC+00:00" -else: - UTC_NAME = "UTC" +UTC_NAME = "UTC" @pytest.mark.parametrize( diff --git a/tests/test_filesink_retention.py b/tests/test_filesink_retention.py index a8fab8aeb..ef565ca22 100644 --- a/tests/test_filesink_retention.py +++ b/tests/test_filesink_retention.py @@ -115,7 +115,7 @@ def test_not_managed_files(tmp_path): i = logger.add(tmp_path / "test.log", retention=0, catch=False) logger.remove(i) - assert set(f.name for f in tmp_path.iterdir()) == others + assert {f.name for f in tmp_path.iterdir()} == others @pytest.mark.parametrize("filename", ["test", "test.log"]) diff --git a/tests/test_repr.py b/tests/test_repr.py index a705c02fe..2e398eef2 100644 --- a/tests/test_repr.py +++ b/tests/test_repr.py @@ -1,6 +1,5 @@ import logging import pathlib -import re import sys from loguru import logger @@ -154,12 +153,8 @@ def __repr__(self): def test_standard_handler(): handler = logging.StreamHandler(sys.__stderr__) logger.add(handler) - if sys.version_info >= (3, 6): - r = " (NOTSET)>)]>" - assert repr(logger) == r - else: - r = r"\)\]>" - assert re.match(r, repr(logger)) + r = " (NOTSET)>)]>" + assert repr(logger) == r def test_multiple_handlers(): From 5e2b47bd53a2cecee9d475e8e20608baf099ac02 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 04:55:45 +0800 Subject: [PATCH 05/12] fix pyi --- loguru/__init__.pyi | 66 ++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/loguru/__init__.pyi b/loguru/__init__.pyi index 66c958859..6060578c2 100644 --- a/loguru/__init__.pyi +++ b/loguru/__init__.pyi @@ -87,16 +87,18 @@ It helps to catch several possible runtime errors by performing additional check For more details, go to official |documentation of loguru-mypy|_. """ -import sys from asyncio import AbstractEventLoop from datetime import datetime, time, timedelta from logging import Handler from multiprocessing.context import BaseContext +from os import PathLike from types import TracebackType from typing import ( Any, + Awaitable, BinaryIO, Callable, + ContextManager, Dict, Generator, Generic, @@ -105,34 +107,18 @@ from typing import ( NewType, Optional, Pattern, + Protocol, Sequence, TextIO, Tuple, Type, + TypedDict, TypeVar, Union, overload, ) -if sys.version_info >= (3, 5, 3): - from typing import Awaitable -else: - from typing_extensions import Awaitable - -if sys.version_info >= (3, 6): - from os import PathLike - from typing import ContextManager - - PathLikeStr = PathLike[str] -else: - from pathlib import PurePath as PathLikeStr - - from typing_extensions import ContextManager - -if sys.version_info >= (3, 8): - from typing import Protocol, TypedDict -else: - from typing_extensions import Protocol, TypedDict +PathLikeStr = PathLike[str] _T = TypeVar("_T") _F = TypeVar("_F", bound=Callable[..., Any]) @@ -320,8 +306,8 @@ class Logger: depth: int = ..., ansi: bool = ..., ) -> Logger: ... - def bind(__self, **kwargs: Any) -> Logger: ... # noqa: N805 - def contextualize(__self, **kwargs: Any) -> Contextualizer: ... # noqa: N805 + def bind(self, **kwargs: Any) -> Logger: ... # noqa: N805 + def contextualize(self, **kwargs: Any) -> Contextualizer: ... # noqa: N805 def patch(self, patcher: PatcherFunction) -> Logger: ... @overload def level(self, name: str) -> Level: ... @@ -371,43 +357,43 @@ class Logger: chunk: int = ..., ) -> Generator[Dict[str, Any], None, None]: ... @overload - def trace(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def trace(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def trace(__self, __message: Any) -> None: ... # noqa: N805 + def trace(self, __message: Any) -> None: ... # noqa: N805 @overload - def debug(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def debug(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def debug(__self, __message: Any) -> None: ... # noqa: N805 + def debug(self, __message: Any) -> None: ... # noqa: N805 @overload - def info(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def info(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def info(__self, __message: Any) -> None: ... # noqa: N805 + def info(self, __message: Any) -> None: ... # noqa: N805 @overload - def success(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def success(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def success(__self, __message: Any) -> None: ... # noqa: N805 + def success(self, __message: Any) -> None: ... # noqa: N805 @overload - def warning(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def warning(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def warning(__self, __message: Any) -> None: ... # noqa: N805 + def warning(self, __message: Any) -> None: ... # noqa: N805 @overload - def error(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def error(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def error(__self, __message: Any) -> None: ... # noqa: N805 + def error(self, __message: Any) -> None: ... # noqa: N805 @overload - def critical(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def critical(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def critical(__self, __message: Any) -> None: ... # noqa: N805 + def critical(self, __message: Any) -> None: ... # noqa: N805 @overload - def exception(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def exception(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def exception(__self, __message: Any) -> None: ... # noqa: N805 + def exception(self, __message: Any) -> None: ... # noqa: N805 @overload def log( - __self, __level: Union[int, str], __message: str, *args: Any, **kwargs: Any # noqa: N805 + self, __level: Union[int, str], __message: str, *args: Any, **kwargs: Any # noqa: N805 ) -> None: ... @overload - def log(__self, __level: Union[int, str], __message: Any) -> None: ... # noqa: N805 + def log(self, __level: Union[int, str], __message: Any) -> None: ... # noqa: N805 def start(self, *args: Any, **kwargs: Any) -> int: ... def stop(self, *args: Any, **kwargs: Any) -> None: ... From dd9d67ae409f51cddf95e37b7b7c2fc781d3a1af Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:09:57 +0800 Subject: [PATCH 06/12] fix old python --- loguru/__init__.pyi | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/loguru/__init__.pyi b/loguru/__init__.pyi index 6060578c2..a846bd759 100644 --- a/loguru/__init__.pyi +++ b/loguru/__init__.pyi @@ -87,6 +87,7 @@ It helps to catch several possible runtime errors by performing additional check For more details, go to official |documentation of loguru-mypy|_. """ +import sys from asyncio import AbstractEventLoop from datetime import datetime, time, timedelta from logging import Handler @@ -107,17 +108,20 @@ from typing import ( NewType, Optional, Pattern, - Protocol, Sequence, TextIO, Tuple, Type, - TypedDict, TypeVar, Union, overload, ) +if sys.version_info >= (3, 8): + from typing import Protocol, TypedDict +else: + from typing_extensions import Protocol, TypedDict + PathLikeStr = PathLike[str] _T = TypeVar("_T") From f17c5de2a832a8d821a460dc4f44631d69e09099 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:24:31 +0800 Subject: [PATCH 07/12] fix --- loguru/__init__.pyi | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/loguru/__init__.pyi b/loguru/__init__.pyi index a846bd759..8d3f8855d 100644 --- a/loguru/__init__.pyi +++ b/loguru/__init__.pyi @@ -361,37 +361,37 @@ class Logger: chunk: int = ..., ) -> Generator[Dict[str, Any], None, None]: ... @overload - def trace(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def trace(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def trace(self, __message: Any) -> None: ... # noqa: N805 + def trace(__self, __message: Any) -> None: ... # noqa: N805 @overload - def debug(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def debug(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def debug(self, __message: Any) -> None: ... # noqa: N805 + def debug(__self, __message: Any) -> None: ... # noqa: N805 @overload - def info(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def info(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def info(self, __message: Any) -> None: ... # noqa: N805 + def info(__self, __message: Any) -> None: ... # noqa: N805 @overload - def success(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def success(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def success(self, __message: Any) -> None: ... # noqa: N805 + def success(__self, __message: Any) -> None: ... # noqa: N805 @overload - def warning(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def warning(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def warning(self, __message: Any) -> None: ... # noqa: N805 + def warning(__self, __message: Any) -> None: ... # noqa: N805 @overload - def error(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def error(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def error(self, __message: Any) -> None: ... # noqa: N805 + def error(__self, __message: Any) -> None: ... # noqa: N805 @overload - def critical(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def critical(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def critical(self, __message: Any) -> None: ... # noqa: N805 + def critical(__self, __message: Any) -> None: ... # noqa: N805 @overload - def exception(self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 + def exception(__self, __message: str, *args: Any, **kwargs: Any) -> None: ... # noqa: N805 @overload - def exception(self, __message: Any) -> None: ... # noqa: N805 + def exception(__self, __message: Any) -> None: ... # noqa: N805 @overload def log( self, __level: Union[int, str], __message: str, *args: Any, **kwargs: Any # noqa: N805 From 5bd01d0ae69c5d0853321e9839768985853edab2 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:42:18 +0800 Subject: [PATCH 08/12] fix cov --- loguru/_better_exceptions.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/loguru/_better_exceptions.py b/loguru/_better_exceptions.py index 94610c713..8b9fbb171 100644 --- a/loguru/_better_exceptions.py +++ b/loguru/_better_exceptions.py @@ -10,23 +10,11 @@ import tokenize import traceback -if sys.version_info >= (3, 11): +from exceptiongroup import ExceptionGroup - def is_exception_group(exc): - return isinstance(exc, ExceptionGroup) -else: - try: - from exceptiongroup import ExceptionGroup - except ImportError: - - def is_exception_group(exc): - return False - - else: - - def is_exception_group(exc): - return isinstance(exc, ExceptionGroup) +def is_exception_group(exc): + return isinstance(exc, ExceptionGroup) class SyntaxHighlighter: From fcc4ecdae7e6cb0331f73665d6819a0ee9965afd Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:46:58 +0800 Subject: [PATCH 09/12] fix --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 311aa39f6..9145a256d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,8 @@ classifiers = [ ] dependencies = [ "colorama>=0.3.4 ; sys_platform=='win32'", - "win32-setctime>=1.0.0 ; sys_platform=='win32'" + "win32-setctime>=1.0.0 ; sys_platform=='win32'", + "exceptiongroup==1.1.3 ; python_version<'3.11'" ] description = "Python logging made (stupidly) simple" dynamic = ['version'] @@ -56,7 +57,7 @@ dev = [ "colorama==0.4.6 ; python_version>='3.8'", "freezegun==1.1.0 ; python_version<'3.8'", "freezegun==1.5.0 ; python_version>='3.8'", - "exceptiongroup==1.1.3 ; python_version>='3.7' and python_version<'3.11'", + "exceptiongroup==1.1.3 ; python_version<'3.11'", # Type checking. "mypy==v0.971 ; python_version<'3.7'", "mypy==v1.4.1 ; python_version>='3.7' and python_version<'3.8'", From 9bba40fd9a79fadc3ede690cfcbed42eef0f1289 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:50:28 +0800 Subject: [PATCH 10/12] fix --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9145a256d..29ebc2dac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ dependencies = [ "colorama>=0.3.4 ; sys_platform=='win32'", "win32-setctime>=1.0.0 ; sys_platform=='win32'", - "exceptiongroup==1.1.3 ; python_version<'3.11'" + "exceptiongroup>=1.1.3,<2 ; python_version<'3.13'" ] description = "Python logging made (stupidly) simple" dynamic = ['version'] @@ -57,7 +57,7 @@ dev = [ "colorama==0.4.6 ; python_version>='3.8'", "freezegun==1.1.0 ; python_version<'3.8'", "freezegun==1.5.0 ; python_version>='3.8'", - "exceptiongroup==1.1.3 ; python_version<'3.11'", + "exceptiongroup==1.1.3 ; python_version<'3.13'", # Type checking. "mypy==v0.971 ; python_version<'3.7'", "mypy==v1.4.1 ; python_version>='3.7' and python_version<'3.8'", From 33e77715cd194f6d814e5219e14cdabdde091420 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:50:50 +0800 Subject: [PATCH 11/12] fix --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 29ebc2dac..7cf2a2896 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ dependencies = [ "colorama>=0.3.4 ; sys_platform=='win32'", "win32-setctime>=1.0.0 ; sys_platform=='win32'", - "exceptiongroup>=1.1.3,<2 ; python_version<'3.13'" + "exceptiongroup>=1.1.3,<2 ; python_version<'3.11'" ] description = "Python logging made (stupidly) simple" dynamic = ['version'] @@ -57,7 +57,7 @@ dev = [ "colorama==0.4.6 ; python_version>='3.8'", "freezegun==1.1.0 ; python_version<'3.8'", "freezegun==1.5.0 ; python_version>='3.8'", - "exceptiongroup==1.1.3 ; python_version<'3.13'", + "exceptiongroup==1.1.3 ; python_version<'3.11'", # Type checking. "mypy==v0.971 ; python_version<'3.7'", "mypy==v1.4.1 ; python_version>='3.7' and python_version<'3.8'", From 44f5c025d85eafe304e313405eaa7ad867d86ecb Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 12 Sep 2024 05:52:15 +0800 Subject: [PATCH 12/12] fix --- loguru/_better_exceptions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/loguru/_better_exceptions.py b/loguru/_better_exceptions.py index 8b9fbb171..a4cedb913 100644 --- a/loguru/_better_exceptions.py +++ b/loguru/_better_exceptions.py @@ -10,7 +10,8 @@ import tokenize import traceback -from exceptiongroup import ExceptionGroup +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup def is_exception_group(exc):