From 8abc77e868dfc9e2cfdc2d09779074814f8829fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Wed, 27 May 2026 15:50:59 +0300 Subject: [PATCH 01/15] Enable isort combine-as-imports in ruff config --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 952b6fa..783599f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,7 @@ testpaths = ["tests/documentation", "tests/typing", "tests/units"] [tool.ruff] lint.ignore = ['E501', 'E712', 'PTH123', 'PTH118', 'PLR2004', 'PTH107', 'SIM105', 'SIM102', 'RET503', 'PLR0912', 'C901', 'E731', 'F821'] lint.select = ["ERA001", "YTT", "ASYNC", "BLE", "B", "A", "COM", "INP", "PIE", "T20", "PT", "RSE", "RET", "SIM", "SLOT", "TID252", "ARG", "PTH", "I", "C90", "N", "E", "W", "D201", "D202", "D419", "F", "PL", "PLE", "PLR", "PLW", "RUF", "TRY201", "TRY400", "TRY401"] +lint.isort.combine-as-imports = true format.quote-style = "single" [project.urls] From 29e66e1adacff4d105376437dd6739653a919585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Wed, 27 May 2026 15:51:24 +0300 Subject: [PATCH 02/15] Fix error import order and add missing aliases in suby modules --- suby/__init__.py | 10 +++++----- suby/errors.py | 6 ++++-- suby/run.py | 4 ++-- tests/typing/test_typing_run.py | 2 -- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/suby/__init__.py b/suby/__init__.py index c4cf99b..9f5b8e2 100644 --- a/suby/__init__.py +++ b/suby/__init__.py @@ -1,10 +1,10 @@ -from suby.errors import ConditionCancellationError as ConditionCancellationError from suby.errors import ( + ConditionCancellationError as ConditionCancellationError, EnvironmentVariablesConflict as EnvironmentVariablesConflict, + RunningCommandError as RunningCommandError, + TimeoutCancellationError as TimeoutCancellationError, + WrongCommandError as WrongCommandError, + WrongDirectoryError as WrongDirectoryError, ) -from suby.errors import RunningCommandError as RunningCommandError -from suby.errors import TimeoutCancellationError as TimeoutCancellationError -from suby.errors import WrongCommandError as WrongCommandError -from suby.errors import WrongDirectoryError as WrongDirectoryError from suby.run import run as run from suby.subprocess_result import SubprocessResult as SubprocessResult diff --git a/suby/errors.py b/suby/errors.py index 12e3f01..840682a 100644 --- a/suby/errors.py +++ b/suby/errors.py @@ -1,5 +1,7 @@ -from cantok import ConditionCancellationError as CantokConditionCancellationError -from cantok import TimeoutCancellationError as CantokTimeoutCancellationError +from cantok import ( + ConditionCancellationError as CantokConditionCancellationError, + TimeoutCancellationError as CantokTimeoutCancellationError, +) from suby.subprocess_result import SubprocessResult diff --git a/suby/run.py b/suby/run.py index 659a58e..cc7a60b 100644 --- a/suby/run.py +++ b/suby/run.py @@ -36,11 +36,11 @@ from cantok import ( AbstractToken, CancellationError, + ConditionCancellationError as CantokConditionCancellationError, DefaultToken, + TimeoutCancellationError as CantokTimeoutCancellationError, TimeoutToken, ) -from cantok import ConditionCancellationError as CantokConditionCancellationError -from cantok import TimeoutCancellationError as CantokTimeoutCancellationError from emptylog import EmptyLogger, LoggerProtocol from sigmatch import PossibleCallMatcher, SignatureMismatchError diff --git a/tests/typing/test_typing_run.py b/tests/typing/test_typing_run.py index 39c4227..e450fed 100644 --- a/tests/typing/test_typing_run.py +++ b/tests/typing/test_typing_run.py @@ -18,8 +18,6 @@ ) from suby.errors import ( EnvironmentVariablesConflict as ModuleEnvironmentVariablesConflict, -) -from suby.errors import ( WrongDirectoryError as ModuleWrongDirectoryError, ) from suby.subprocess_result import SubprocessResult From 9de0eaa0b0d9212207b968a2d0b1a996ca7a87e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Wed, 27 May 2026 15:52:03 +0300 Subject: [PATCH 03/15] Bumped version to 0.0.11 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 783599f..720b29e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "suby" -version = "0.0.10" +version = "0.0.11" authors = [ { name="Evgeniy Blinov", email="zheni-b@yandex.ru" }, ] From e68ca665edef2271035d3c244f067d4faa75fa80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Wed, 27 May 2026 15:52:32 +0300 Subject: [PATCH 04/15] Update sigmatch dependency to version 0.0.10 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 720b29e..f563055 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ 'emptylog>=0.0.12', 'cantok>=0.0.36', 'microbenchmark>=0.0.3', - 'sigmatch>=0.0.9', + 'sigmatch>=0.0.10', ] classifiers = [ "Operating System :: OS Independent", From e3f161abd1c1e329a1e74c6361969092dd916fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 26 Jun 2026 17:43:54 +0300 Subject: [PATCH 05/15] Update isort config to force single-line imports --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index f563055..9e3ef56 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,7 @@ testpaths = ["tests/documentation", "tests/typing", "tests/units"] lint.ignore = ['E501', 'E712', 'PTH123', 'PTH118', 'PLR2004', 'PTH107', 'SIM105', 'SIM102', 'RET503', 'PLR0912', 'C901', 'E731', 'F821'] lint.select = ["ERA001", "YTT", "ASYNC", "BLE", "B", "A", "COM", "INP", "PIE", "T20", "PT", "RSE", "RET", "SIM", "SLOT", "TID252", "ARG", "PTH", "I", "C90", "N", "E", "W", "D201", "D202", "D419", "F", "PL", "PLE", "PLR", "PLW", "RUF", "TRY201", "TRY400", "TRY401"] lint.isort.combine-as-imports = true +lint.isort.force-single-line = true format.quote-style = "single" [project.urls] From 8a4d7fa2b7230039a0dc61229c62cadc133a0869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 26 Jun 2026 17:47:43 +0300 Subject: [PATCH 06/15] Set isort to allow multi-line imports --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9e3ef56..0c7a875 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ testpaths = ["tests/documentation", "tests/typing", "tests/units"] lint.ignore = ['E501', 'E712', 'PTH123', 'PTH118', 'PLR2004', 'PTH107', 'SIM105', 'SIM102', 'RET503', 'PLR0912', 'C901', 'E731', 'F821'] lint.select = ["ERA001", "YTT", "ASYNC", "BLE", "B", "A", "COM", "INP", "PIE", "T20", "PT", "RSE", "RET", "SIM", "SLOT", "TID252", "ARG", "PTH", "I", "C90", "N", "E", "W", "D201", "D202", "D419", "F", "PL", "PLE", "PLR", "PLW", "RUF", "TRY201", "TRY400", "TRY401"] lint.isort.combine-as-imports = true -lint.isort.force-single-line = true +lint.isort.force-single-line = false format.quote-style = "single" [project.urls] From 68cf6a90fa9bcfdb3188185372a590d56ece6bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 26 Jun 2026 17:48:01 +0300 Subject: [PATCH 07/15] Fix import in test_process_waiting.py --- tests/units/test_process_waiting.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/units/test_process_waiting.py b/tests/units/test_process_waiting.py index b07c650..8489892 100644 --- a/tests/units/test_process_waiting.py +++ b/tests/units/test_process_waiting.py @@ -15,10 +15,7 @@ from cantok import ConditionToken, SimpleToken, TimeoutCancellationError from suby import process_waiting, run -from suby.process_waiting import ( - has_event_driven_wait, - wait_for_process_exit, -) +from suby.process_waiting import has_event_driven_wait, wait_for_process_exit from suby.subprocess_result import SubprocessResult _run_module = importlib.import_module('suby.run') From 0a2a6eff2804060866e1fed0c2f26d82f0642b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 26 Jun 2026 19:20:49 +0300 Subject: [PATCH 08/15] Rename coverage startup file from suby_coverage_process_startup.pth to coverage_process_startup.pth --- .github/workflows/tests_and_coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests_and_coverage.yml b/.github/workflows/tests_and_coverage.yml index b8b8bac..685a3f8 100644 --- a/.github/workflows/tests_and_coverage.yml +++ b/.github/workflows/tests_and_coverage.yml @@ -44,7 +44,7 @@ jobs: - name: Run tests and show the branch coverage on the command line shell: bash run: | - pth_file="$(python -c 'import sysconfig; print(sysconfig.get_path("purelib"))')/suby_coverage_process_startup.pth" + pth_file="$(python -c 'import sysconfig; print(sysconfig.get_path("purelib"))')/coverage_process_startup.pth" printf "import os; os.getenv('COVERAGE_PROCESS_START') and __import__('coverage').process_startup()\n" > "$pth_file" coverage erase COVERAGE_PROCESS_START="$PWD/pyproject.toml" coverage run -m pytest -n auto --cache-clear --assert=plain From d291140425fe462c7e1c37ee0f1df5e25e543075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 26 Jun 2026 19:21:01 +0300 Subject: [PATCH 09/15] Bump cantok to 0.0.38 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0c7a875..7aa4be2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ readme = "README.md" requires-python = ">=3.8" dependencies = [ 'emptylog>=0.0.12', - 'cantok>=0.0.36', + 'cantok>=0.0.38', 'microbenchmark>=0.0.3', 'sigmatch>=0.0.10', ] From a41eba14127a344ded5ef67515e441eaf63dec50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 26 Jun 2026 19:50:07 +0300 Subject: [PATCH 10/15] Update workflow and project config to use single quotes consistently --- .github/workflows/benchmarks.yml | 2 +- pyproject.toml | 34 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index f55cc9e..a2cc56c 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -3,7 +3,7 @@ name: Benchmarks on: push: branches: - - "main" + - 'main' pull_request: workflow_dispatch: diff --git a/pyproject.toml b/pyproject.toml index 7aa4be2..b7da870 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,16 @@ [build-system] -requires = ["flit_core==3.12.0"] -build-backend = "flit_core.buildapi" +requires = ['flit_core==3.12.0'] +build-backend = 'flit_core.buildapi' [project] -name = "suby" -version = "0.0.11" +name = 'suby' +version = '0.0.11' authors = [ - { name="Evgeniy Blinov", email="zheni-b@yandex.ru" }, + { name='Evgeniy Blinov', email='zheni-b@yandex.ru' }, ] description = 'Slightly simplified subprocesses' -readme = "README.md" -requires-python = ">=3.8" +readme = 'README.md' +requires-python = '>=3.8' dependencies = [ 'emptylog>=0.0.12', 'cantok>=0.0.38', @@ -18,7 +18,7 @@ dependencies = [ 'sigmatch>=0.0.10', ] classifiers = [ - "Operating System :: OS Independent", + 'Operating System :: OS Independent', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Microsoft :: Windows', 'Operating System :: POSIX', @@ -46,28 +46,28 @@ keywords = [ ] [tool.mutmut] -paths_to_mutate=["suby"] +paths_to_mutate=['suby'] [tool.coverage.run] branch = true parallel = true -plugins = ["coverage_pyver_pragma"] -source = ["suby"] +plugins = ['coverage_pyver_pragma'] +source = ['suby'] [tool.pytest.ini_options] -addopts = "-m 'not slow'" +addopts = '-m "not slow"' markers = [ - "slow: tests that create isolated environments, install dependencies, or otherwise take noticeably longer", + 'slow: tests that create isolated environments, install dependencies, or otherwise take noticeably longer', ] -norecursedirs = ["build", "mutants"] -testpaths = ["tests/documentation", "tests/typing", "tests/units"] +norecursedirs = ['build', 'mutants'] +testpaths = ['tests/documentation', 'tests/typing', 'tests/units'] [tool.ruff] lint.ignore = ['E501', 'E712', 'PTH123', 'PTH118', 'PLR2004', 'PTH107', 'SIM105', 'SIM102', 'RET503', 'PLR0912', 'C901', 'E731', 'F821'] -lint.select = ["ERA001", "YTT", "ASYNC", "BLE", "B", "A", "COM", "INP", "PIE", "T20", "PT", "RSE", "RET", "SIM", "SLOT", "TID252", "ARG", "PTH", "I", "C90", "N", "E", "W", "D201", "D202", "D419", "F", "PL", "PLE", "PLR", "PLW", "RUF", "TRY201", "TRY400", "TRY401"] +lint.select = ['ERA001', 'YTT', 'ASYNC', 'BLE', 'B', 'A', 'COM', 'INP', 'PIE', 'T20', 'PT', 'RSE', 'RET', 'SIM', 'SLOT', 'TID252', 'ARG', 'PTH', 'I', 'C90', 'N', 'E', 'W', 'D201', 'D202', 'D419', 'F', 'PL', 'PLE', 'PLR', 'PLW', 'RUF', 'TRY201', 'TRY400', 'TRY401'] lint.isort.combine-as-imports = true lint.isort.force-single-line = false -format.quote-style = "single" +format.quote-style = 'single' [project.urls] 'Source' = 'https://github.com/mutating/suby' From 7174892ff48cc2f7b196ace416b5952d2e249761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Tue, 30 Jun 2026 01:00:18 +0300 Subject: [PATCH 11/15] Update cantok dependency to version 0.0.40 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b7da870..43c3cee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ readme = 'README.md' requires-python = '>=3.8' dependencies = [ 'emptylog>=0.0.12', - 'cantok>=0.0.38', + 'cantok>=0.0.40', 'microbenchmark>=0.0.3', 'sigmatch>=0.0.10', ] From f51d93c52cea2a9f7cd799a5a5223d3e2dcfdf52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Tue, 30 Jun 2026 01:01:09 +0300 Subject: [PATCH 12/15] Add observed_time parameter to test token + timeout cancellation logic --- tests/units/test_run.py | 51 +++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/tests/units/test_run.py b/tests/units/test_run.py index 5c7379e..7228089 100644 --- a/tests/units/test_run.py +++ b/tests/units/test_run.py @@ -12,7 +12,7 @@ from io import StringIO from os import environ from pathlib import Path, PurePath -from threading import Event, Thread +from threading import Event, Lock, Thread from time import perf_counter from types import MappingProxyType, SimpleNamespace from typing import Any, List, cast @@ -385,28 +385,55 @@ def test_condition_token_cancellation_returns_or_raises_killed_result_according_ @pytest.mark.parametrize( - ('command', 'run_timeout', 'expected_exception', 'expected_token_identity'), + ('command', 'run_timeout', 'condition_timeout', 'observed_time', 'expected_exception', 'expected_token_identity'), [ - ((sys.executable, '-c "import time; time.sleep({sleep_time})"'), 3, ConditionCancellationError, True), - (('python -c "import time; time.sleep({sleep_time})"',), 3, ConditionCancellationError, True), - ((sys.executable, '-c "import time; time.sleep({sleep_time})"'), 0.05, TimeoutCancellationError, False), - (('python -c "import time; time.sleep({sleep_time})"',), 0.05, TimeoutCancellationError, False), + ((sys.executable, '-c "import time; time.sleep({sleep_time})"'), 3, 0.1, 0.2, ConditionCancellationError, True), + (('python -c "import time; time.sleep({sleep_time})"',), 3, 0.1, 0.2, ConditionCancellationError, True), + ((sys.executable, '-c "import time; time.sleep({sleep_time})"'), 0.05, 0.1, 0.06, TimeoutCancellationError, False), + (('python -c "import time; time.sleep({sleep_time})"',), 0.05, 0.1, 0.06, TimeoutCancellationError, False), ], ) def test_token_plus_timeout_without_catching_raises_expected_cancellation( command, run_timeout, + condition_timeout, + observed_time, expected_exception, expected_token_identity, + monkeypatch, assert_no_suby_thread_leaks, ): - """When token and timeout are both configured, the earlier cancellation source determines which exception is raised.""" + """When token and timeout are both configured, the earlier cancellation source determines which exception is raised. + + This intentionally patches time.perf_counter because the unpatched version would depend on a narrow real-time + window: timeout must become active after 0.05 seconds while ConditionToken must still be inactive until 0.1 seconds. + Slow or differently scheduled runtimes, especially free-threaded Python under xdist and coverage, can miss that + window and make both tokens active before the first observed cancellation. + + Patching global clocks should be justified because it can affect unrelated code in the same test process. Here the + patch is scoped by monkeypatch, the test keeps its own elapsed-time measurement on the already imported real + perf_counter, and cantok's TimeoutToken intentionally reads time.perf_counter through the time module. This keeps the + production path intact: run() still creates a real TimeoutToken, but the token sees a deterministic start time and + then a deterministic observation time. That lets the test assert the cancellation source selected by the token + composition without making CI timing part of the contract. + """ sleep_time = 100000 - timeout = 0.1 command = [subcommand.format(sleep_time=sleep_time) if isinstance(subcommand, str) else subcommand for subcommand in command] + timer_state = SimpleNamespace(calls=0) + timer_lock = Lock() + + def controlled_perf_counter(): + with timer_lock: + timer_state.calls += 1 + if timer_state.calls == 1: + return 0.0 + return observed_time + + monkeypatch.setattr(time, 'perf_counter', controlled_perf_counter) + start_time = perf_counter() - token = ConditionToken(lambda: perf_counter() - start_time > timeout) + token = ConditionToken(lambda: observed_time > condition_timeout) with assert_no_suby_thread_leaks(), pytest.raises(expected_exception) as exc_info: run(*command, token=token, timeout=run_timeout) @@ -418,13 +445,17 @@ def test_token_plus_timeout_without_catching_raises_expected_cancellation( result = exc_info.value.result end_time = perf_counter() + assert timer_state.calls >= 1 assert result.returncode != 0 assert result.stdout == '' assert result.stderr == '' assert result.killed_by_token == True - assert end_time - start_time >= min(timeout, run_timeout) + if expected_exception is ConditionCancellationError: + assert condition_timeout < observed_time < run_timeout + else: + assert run_timeout < observed_time < condition_timeout assert end_time - start_time < sleep_time From c0d294a6a0ac54dd75ade9cc96a49e8886d2e064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Tue, 30 Jun 2026 01:14:09 +0300 Subject: [PATCH 13/15] Fix test function signature to match expected parameters --- tests/units/test_run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/units/test_run.py b/tests/units/test_run.py index 7228089..af72f48 100644 --- a/tests/units/test_run.py +++ b/tests/units/test_run.py @@ -393,7 +393,7 @@ def test_condition_token_cancellation_returns_or_raises_killed_result_according_ (('python -c "import time; time.sleep({sleep_time})"',), 0.05, 0.1, 0.06, TimeoutCancellationError, False), ], ) -def test_token_plus_timeout_without_catching_raises_expected_cancellation( +def test_token_plus_timeout_without_catching_raises_expected_cancellation( # noqa: PLR0913 command, run_timeout, condition_timeout, From db048206a628c4ddad661b2a682fe55bc5c4bdf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Tue, 30 Jun 2026 01:18:08 +0300 Subject: [PATCH 14/15] Update Python version in lint workflow to 3.15.0-beta.3 --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 87981fe..61e333d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ jobs: timeout-minutes: 20 strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.14t', '3.15.0-beta.1'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.14t', '3.15.0-beta.3'] steps: - uses: actions/checkout@v4 From 5245085c688ffbd7bf22de5a34de7182ab416d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=91=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Tue, 30 Jun 2026 01:18:23 +0300 Subject: [PATCH 15/15] Update Python version to 3.15.0-beta.3 in test workflow --- .github/workflows/tests_and_coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests_and_coverage.yml b/.github/workflows/tests_and_coverage.yml index 685a3f8..6a64339 100644 --- a/.github/workflows/tests_and_coverage.yml +++ b/.github/workflows/tests_and_coverage.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.14t', '3.15.0-beta.1'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.14t', '3.15.0-beta.3'] steps: - uses: actions/checkout@v4