diff --git a/.github/workflows/check_wheel_availability.yaml b/.github/workflows/check_wheel_availability.yaml index 0d3f0108d1..db2eecf22c 100644 --- a/.github/workflows/check_wheel_availability.yaml +++ b/.github/workflows/check_wheel_availability.yaml @@ -43,7 +43,7 @@ jobs: matrix: arm - name: Intel matrix: intel - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.11", "3.12", "3.13", "3.14"] exclude: - os: matrix: windows diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 8b959ed89d..d459861f18 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -71,7 +71,6 @@ jobs: - name: Intel matrix: intel python: - - major_dot_minor: "3.10" - major_dot_minor: "3.11" - major_dot_minor: "3.12" - major_dot_minor: "3.13" diff --git a/.github/workflows/test-install-scripts.yml b/.github/workflows/test-install-scripts.yml index bb7a86c5ef..f5e2d8f04f 100644 --- a/.github/workflows/test-install-scripts.yml +++ b/.github/workflows/test-install-scripts.yml @@ -193,6 +193,7 @@ jobs: - name: ubuntu:jammy (22.04) type: ubuntu # https://packages.ubuntu.com/jammy/python3 (22.04, 3.10) + # Prepare Ubuntu falls back to python3.11-venv from universe. url: "docker://ubuntu:jammy" - name: ubuntu:noble (24.04) type: ubuntu @@ -267,7 +268,7 @@ jobs: run: | apt-get --yes update apt-get install --yes git lsb-release - MINIMUM=3.10 + MINIMUM=3.11 if ! apt-get satisfy --yes "python3-venv (>= ${MINIMUM})" then apt-get install --yes python${MINIMUM}-venv diff --git a/.github/workflows/test-single.yml b/.github/workflows/test-single.yml index f29dc8dfa3..2e56be635a 100644 --- a/.github/workflows/test-single.yml +++ b/.github/workflows/test-single.yml @@ -122,15 +122,6 @@ jobs: - matrix: ${{ inputs.arch }} emoji: ${{ inputs.arch-emoji }} python: - - name: "3.10" - file_name: "3.10" - action: "3.10" - apt: "3.10" - install_sh: "3.10" - matrix: "3.10" - exclude_from: - limited: True - main: True - name: "3.11" file_name: "3.11" action: "3.11" diff --git a/.github/workflows/upload-pypi-source.yml b/.github/workflows/upload-pypi-source.yml index 5a441af6d4..b781fed5c6 100644 --- a/.github/workflows/upload-pypi-source.yml +++ b/.github/workflows/upload-pypi-source.yml @@ -89,7 +89,6 @@ jobs: emoji: 🌀 matrix: intel python: - - major_dot_minor: "3.10" - major_dot_minor: "3.11" - major_dot_minor: "3.12" - major_dot_minor: "3.13" diff --git a/Install.ps1 b/Install.ps1 index 90c35790ce..7d71e7f629 100644 --- a/Install.ps1 +++ b/Install.ps1 @@ -46,7 +46,7 @@ if ($null -eq (Get-Command py -ErrorAction SilentlyContinue)) Exit 1 } -$supportedPythonVersions = "3.14", "3.13", "3.12", "3.11", "3.10" +$supportedPythonVersions = "3.14", "3.13", "3.12", "3.11" if ("$env:INSTALL_PYTHON_VERSION" -ne "") { $pythonVersion = $env:INSTALL_PYTHON_VERSION diff --git a/README.md b/README.md index 32d80b03b8..189d8351ec 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Chia is a modern cryptocurrency built from scratch, designed to be efficient, de Please check out the [Chia website][link-chia], the [Intro to Chia][link-intro], and [FAQ][link-faq] for information on this project. -Python 3.10+ is required. Make sure your default python version is >=3.10 by typing `python3`. +Python 3.11+ is required. Make sure your default python version is >=3.11 by typing `python3`. If you are behind a NAT, it can be difficult for peers outside your subnet to reach you when they start up. You can enable [UPnP][link-upnp] on your router or add a NAT (for IPv4 but not IPv6) and firewall rules to allow TCP port 8444 access to your peer. diff --git a/chia/_tests/cmds/test_dev_gh.py b/chia/_tests/cmds/test_dev_gh.py index 1eac03cc3d..580b3c1ed2 100644 --- a/chia/_tests/cmds/test_dev_gh.py +++ b/chia/_tests/cmds/test_dev_gh.py @@ -114,7 +114,7 @@ async def test_successfully_dispatches( assert by_name["macos-intel"]["conclusion"] == "skipped" assert by_name["windows"]["conclusion"] == "skipped" - versions = ["3.10", "3.11", "3.12"] + versions = ["3.11", "3.12"] runs_by_name: dict[str, list[str]] = {name: [] for name in ["ubuntu", "macos-arm"]} for name in by_name: platform, _, rest = name.partition(" / ") diff --git a/chia/_tests/cmds/wallet/test_wallet.py b/chia/_tests/cmds/wallet/test_wallet.py index bcd06d26f0..c2fa3d4785 100644 --- a/chia/_tests/cmds/wallet/test_wallet.py +++ b/chia/_tests/cmds/wallet/test_wallet.py @@ -1114,7 +1114,7 @@ def test_get_offers(capsys: object, get_test_cli_clients: tuple[TestRpcClients, FINGERPRINT_ARG, "--summaries", ] - tzinfo = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo + tzinfo = datetime.datetime.now(datetime.UTC).astimezone().tzinfo # these are various things that should be in the output assert_list = [ "Timelock information:", diff --git a/chia/_tests/core/data_layer/test_data_rpc.py b/chia/_tests/core/data_layer/test_data_rpc.py index 58f04479c4..9bbfa2dd58 100644 --- a/chia/_tests/core/data_layer/test_data_rpc.py +++ b/chia/_tests/core/data_layer/test_data_rpc.py @@ -275,11 +275,7 @@ async def run_cli_cmd(*args: str, root_path: Path) -> asyncio.subprocess.Process assert process.stdout is not None assert process.stderr is not None stderr = await process.stderr.read() - if sys.version_info >= (3, 10, 6): - assert stderr == b"" - else: # pragma: no cover - # https://github.com/python/cpython/issues/92841 - assert stderr == b"" or b"_ProactorBasePipeTransport.__del__" in stderr + assert stderr == b"" assert process.returncode == 0 return process @@ -2204,11 +2200,7 @@ async def test_clear_pending_roots( cleared_root = json.loads(stdout) stderr = await process.stderr.read() assert process.returncode == 0 - if sys.version_info >= (3, 10, 6): - assert stderr == b"" - else: # pragma: no cover - # https://github.com/python/cpython/issues/92841 - assert stderr == b"" or b"_ProactorBasePipeTransport.__del__" in stderr + assert stderr == b"" elif layer == InterfaceLayer.client: async with DataLayerRpcClient.create_as_context( self_hostname=self_hostname, @@ -3486,11 +3478,7 @@ async def test_pagination_cmds( else: kv_diff = json.loads(stdout) assert process.returncode == 0 - if sys.version_info >= (3, 10, 6): - assert stderr == b"" - else: # pragma: no cover - # https://github.com/python/cpython/issues/92841 - assert stderr == b"" or b"_ProactorBasePipeTransport.__del__" in stderr + assert stderr == b"" elif layer == InterfaceLayer.client: async with DataLayerRpcClient.create_as_context( self_hostname=self_hostname, @@ -3665,11 +3653,7 @@ async def test_unsubmitted_batch_update( res = json.loads(stdout) stderr = await process.stderr.read() assert process.returncode == 0 - if sys.version_info >= (3, 10, 6): - assert stderr == b"" - else: # pragma: no cover - # https://github.com/python/cpython/issues/92841 - assert stderr == b"" or b"_ProactorBasePipeTransport.__del__" in stderr + assert stderr == b"" assert res == {"success": True} elif layer == InterfaceLayer.client: async with DataLayerRpcClient.create_as_context( @@ -3807,11 +3791,7 @@ async def test_unsubmitted_batch_update( res = json.loads(stdout) stderr = await process.stderr.read() assert process.returncode == 0 - if sys.version_info >= (3, 10, 6): - assert stderr == b"" - else: # pragma: no cover - # https://github.com/python/cpython/issues/92841 - assert stderr == b"" or b"_ProactorBasePipeTransport.__del__" in stderr + assert stderr == b"" update_tx_rec1 = bytes32.from_hexstr(res["tx_id"]) elif layer == InterfaceLayer.client: async with DataLayerRpcClient.create_as_context( diff --git a/chia/_tests/core/data_layer/test_plugin.py b/chia/_tests/core/data_layer/test_plugin.py index 8b8d8f69c8..6672eb32a6 100644 --- a/chia/_tests/core/data_layer/test_plugin.py +++ b/chia/_tests/core/data_layer/test_plugin.py @@ -1,6 +1,5 @@ from __future__ import annotations -import asyncio import json import logging from collections.abc import AsyncIterator @@ -150,7 +149,7 @@ async def test_get_plugin_info_timeout() -> None: with patch( "chia.data_layer.data_layer.aiohttp.ClientSession", - side_effect=asyncio.TimeoutError("connection timed out"), + side_effect=TimeoutError("connection timed out"), ): remote, result = await get_plugin_info(plugin, DUMMY_TIMEOUT) @@ -230,7 +229,7 @@ async def test_download_file_plugin_timeout(tmp_path: Path) -> None: with patch( "chia.data_layer.download_data.aiohttp.ClientSession", - side_effect=asyncio.TimeoutError("plugin timed out"), + side_effect=TimeoutError("plugin timed out"), ): result = await download_file( data_store=data_store, diff --git a/chia/_tests/core/mempool/test_mempool_fee_protocol.py b/chia/_tests/core/mempool/test_mempool_fee_protocol.py index 9e93b3424e..b0a5552928 100644 --- a/chia/_tests/core/mempool/test_mempool_fee_protocol.py +++ b/chia/_tests/core/mempool/test_mempool_fee_protocol.py @@ -38,7 +38,7 @@ async def test_protocol_messages( await time_out_assert(60, node_height_at_least, True, full_node_sim, blocks[-1].height) offset_secs = [60, 120, 300] - now_unix_secs = int(datetime.datetime.now(datetime.timezone.utc).timestamp()) + now_unix_secs = int(datetime.datetime.now(datetime.UTC).timestamp()) request_times = [uint64(now_unix_secs + s) for s in offset_secs] request: wallet_protocol.RequestFeeEstimates = wallet_protocol.RequestFeeEstimates(request_times) estimates = await full_node_sim.request_fee_estimates(request) diff --git a/chia/_tests/core/server/test_event_loop.py b/chia/_tests/core/server/test_event_loop.py index 0d4977a8b6..5903e1bb77 100644 --- a/chia/_tests/core/server/test_event_loop.py +++ b/chia/_tests/core/server/test_event_loop.py @@ -32,21 +32,14 @@ def test_base_event_loop_has_methods() -> None: assert inspect.ismethod(method) if sys.version_info >= (3, 13): expected_signature = "(protocol_factory, host=None, port=None, *, family=, flags=, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)" # ruff: ignore[line-too-long] - elif sys.version_info >= (3, 11): - expected_signature = "(protocol_factory, host=None, port=None, *, family=, flags=, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)" # ruff: ignore[line-too-long] else: - expected_signature = "(protocol_factory, host=None, port=None, *, family=, flags=, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, ssl_handshake_timeout=None, start_serving=True)" # ruff: ignore[line-too-long] + expected_signature = "(protocol_factory, host=None, port=None, *, family=, flags=, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)" # ruff: ignore[line-too-long] assert str(inspect.signature(method)) == expected_signature assert hasattr(base_selector_event_loop, "_start_serving") method = getattr(base_selector_event_loop, "_start_serving") assert inspect.ismethod(method) - if sys.version_info >= (3, 11): - expected_signature = "(protocol_factory, sock, sslcontext=None, server=None, backlog=100, ssl_handshake_timeout=60.0, ssl_shutdown_timeout=30.0)" # ruff: ignore[line-too-long] - else: - expected_signature = ( - "(protocol_factory, sock, sslcontext=None, server=None, backlog=100, ssl_handshake_timeout=60.0)" - ) + expected_signature = "(protocol_factory, sock, sslcontext=None, server=None, backlog=100, ssl_handshake_timeout=60.0, ssl_shutdown_timeout=30.0)" # ruff: ignore[line-too-long] assert str(inspect.signature(method)) == expected_signature assert hasattr(base_selector_event_loop, "remove_reader") @@ -94,13 +87,9 @@ def test_base_event_loop_has_methods() -> None: base_server = super(PausableServer, pausable_server) method = getattr(base_server, "__init__") - if sys.version_info >= (3, 11): - expected_signature = ( - "(loop, sockets, protocol_factory, ssl_context, backlog, ssl_handshake_timeout," - " ssl_shutdown_timeout=None)" - ) - else: - expected_signature = "(loop, sockets, protocol_factory, ssl_context, backlog, ssl_handshake_timeout)" + expected_signature = ( + "(loop, sockets, protocol_factory, ssl_context, backlog, ssl_handshake_timeout, ssl_shutdown_timeout=None)" + ) assert str(inspect.signature(method)) == expected_signature for func in ("_attach", "_detach"): diff --git a/chia/_tests/core/server/test_server.py b/chia/_tests/core/server/test_server.py index b1a1e12059..2a310cbfed 100644 --- a/chia/_tests/core/server/test_server.py +++ b/chia/_tests/core/server/test_server.py @@ -174,7 +174,7 @@ async def test_start_client_handshake_timeout( async def timeout_handshake( self: WSChiaConnection, network_id: str, server_port: uint16, local_type: NodeType ) -> None: - raise asyncio.TimeoutError + raise TimeoutError monkeypatch.setattr(WSChiaConnection, "perform_handshake", timeout_handshake) target_peer = PeerInfo(self_hostname, server_2.get_port()) diff --git a/chia/_tests/farmer_harvester/test_farmer.py b/chia/_tests/farmer_harvester/test_farmer.py index 32f44a9328..79e5db08ab 100644 --- a/chia/_tests/farmer_harvester/test_farmer.py +++ b/chia/_tests/farmer_harvester/test_farmer.py @@ -8,7 +8,7 @@ from contextlib import asynccontextmanager from dataclasses import dataclass from time import time from types import TracebackType -from typing import Any, cast +from typing import Any, Self, cast from unittest.mock import ANY, AsyncMock import pytest @@ -16,7 +16,6 @@ from chia_rs import AugSchemeMPL, G1Element, G2Element, PlotParam, PrivateKey, P from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16, uint32, uint64 from pytest_mock import MockerFixture -from typing_extensions import Self from yarl import URL from chia import __version__ diff --git a/chia/_tests/rpc/test_rpc_server.py b/chia/_tests/rpc/test_rpc_server.py index 4e84a7ed13..32488b3ad9 100644 --- a/chia/_tests/rpc/test_rpc_server.py +++ b/chia/_tests/rpc/test_rpc_server.py @@ -6,7 +6,6 @@ import dataclasses import json import logging import ssl -import sys from collections.abc import AsyncIterator from pathlib import Path from typing import TYPE_CHECKING, Any, ClassVar, cast @@ -26,10 +25,7 @@ from chia.util.ws_message import WsRpcMessage root_logger = logging.getLogger() -if sys.version_info >= (3, 11): # pragma: no cover - name_to_number_level_map = logging.getLevelNamesMapping() -else: - name_to_number_level_map = logging._nameToLevel +name_to_number_level_map = logging.getLevelNamesMapping() number_to_name_level_map = {number: name for name, number in name_to_number_level_map.items()} diff --git a/chia/_tests/simulation/test_start_simulator.py b/chia/_tests/simulation/test_start_simulator.py index 17a91cd071..7c4904bc1a 100644 --- a/chia/_tests/simulation/test_start_simulator.py +++ b/chia/_tests/simulation/test_start_simulator.py @@ -91,7 +91,7 @@ class TestStartSimulator: # We can ignore this timeout as long as the subsequent tests pass try: await simulator_rpc_client.reorg_blocks(2) # fork point 2 blocks, now height is 5 - except asyncio.TimeoutError: + except TimeoutError: pass # ignore this error and hope the reorg is going ahead # wait up to 5 mins diff --git a/chia/_tests/util/misc.py b/chia/_tests/util/misc.py index ba0b406d54..c63dc505fb 100644 --- a/chia/_tests/util/misc.py +++ b/chia/_tests/util/misc.py @@ -20,7 +20,7 @@ from statistics import mean from textwrap import dedent from time import thread_time from types import TracebackType -from typing import TYPE_CHECKING, Any, ClassVar, Protocol, TextIO, TypeVar, cast, final +from typing import TYPE_CHECKING, Any, ClassVar, Protocol, Self, TextIO, TypeVar, cast, final import aiohttp import pytest @@ -31,7 +31,6 @@ from aiohttp import web from chia_rs import Coin from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint32, uint64 -from typing_extensions import Self import chia import chia._tests diff --git a/chia/_tests/util/spend_sim.py b/chia/_tests/util/spend_sim.py index f5b25fdb93..088495bd39 100644 --- a/chia/_tests/util/spend_sim.py +++ b/chia/_tests/util/spend_sim.py @@ -7,7 +7,7 @@ from collections.abc import AsyncIterator from contextlib import asynccontextmanager from dataclasses import dataclass from pathlib import Path -from typing import Any +from typing import Any, Self import anyio from chia_rs import ( @@ -23,7 +23,6 @@ from chia_rs import ( from chia_rs import get_puzzle_and_solution_for_coin2 as get_puzzle_and_solution_for_coin from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 -from typing_extensions import Self from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.consensus.coinbase import create_farmer_coin, create_pool_coin diff --git a/chia/_tests/util/time_out_assert.py b/chia/_tests/util/time_out_assert.py index 8e648f57d2..0d00cdcb42 100644 --- a/chia/_tests/util/time_out_assert.py +++ b/chia/_tests/util/time_out_assert.py @@ -9,9 +9,7 @@ import time from collections.abc import Awaitable, Callable, Iterable from inspect import getframeinfo, stack from pathlib import Path -from typing import TYPE_CHECKING, Any, ClassVar, Protocol, TypeVar, cast, final - -from typing_extensions import Self +from typing import TYPE_CHECKING, Any, ClassVar, Protocol, Self, TypeVar, cast, final import chia import chia._tests diff --git a/chia/_tests/wallet/nft_wallet/test_nft_offers.py b/chia/_tests/wallet/nft_wallet/test_nft_offers.py index b55df35ecb..a60c2c193e 100644 --- a/chia/_tests/wallet/nft_wallet/test_nft_offers.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_offers.py @@ -1,9 +1,10 @@ from __future__ import annotations +from typing import Any + import pytest from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint64 -from typing_extensions import Any from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework from chia._tests.util.time_out_assert import time_out_assert diff --git a/chia/_tests/wallet/nft_wallet/test_nft_wallet.py b/chia/_tests/wallet/nft_wallet/test_nft_wallet.py index 51f07ad31e..4137559712 100644 --- a/chia/_tests/wallet/nft_wallet/test_nft_wallet.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_wallet.py @@ -94,7 +94,7 @@ async def wait_rpc_state_condition( now = time.monotonic() elapsed = now - start if elapsed >= timeout: - raise asyncio.TimeoutError( + raise TimeoutError( f"timed out while waiting for {async_function.__name__}(): {elapsed} >= {timeout}", ) diff --git a/chia/cmds/dev/data.py b/chia/cmds/dev/data.py index 4d72130227..80ae17214f 100644 --- a/chia/cmds/dev/data.py +++ b/chia/cmds/dev/data.py @@ -51,7 +51,7 @@ def data_group() -> None: def print_date(*args: Any, **kwargs: Any) -> None: kwargs.setdefault("flush", True) - s = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds") + s = datetime.datetime.now(datetime.UTC).isoformat(timespec="seconds") print(f"{s}:", *args, **kwargs) diff --git a/chia/cmds/wallet_funcs.py b/chia/cmds/wallet_funcs.py index 7ee37c4fbd..bec4f06104 100644 --- a/chia/cmds/wallet_funcs.py +++ b/chia/cmds/wallet_funcs.py @@ -7,7 +7,7 @@ import pathlib import sys import time from collections.abc import Awaitable, Callable, Sequence -from datetime import datetime, timezone +from datetime import UTC, datetime from decimal import Decimal from typing import Any @@ -709,7 +709,7 @@ async def print_offer_summary( def format_timestamp_with_timezone(timestamp: int) -> str: - tzinfo = datetime.now(timezone.utc).astimezone().tzinfo + tzinfo = datetime.now(UTC).astimezone().tzinfo return datetime.fromtimestamp(timestamp, tz=tzinfo).strftime("%Y-%m-%d %H:%M %Z") diff --git a/chia/daemon/client.py b/chia/daemon/client.py index c4c3986319..6cf588bf52 100644 --- a/chia/daemon/client.py +++ b/chia/daemon/client.py @@ -99,7 +99,7 @@ class DaemonProxy: response: WsRpcMessage = self.response_dict[request_id] self.response_dict.pop(request_id) return response - except asyncio.TimeoutError: + except TimeoutError: self._request_dict.pop(request_id) raise Exception(f"No response from daemon for request_id: {request_id}") diff --git a/chia/daemon/keychain_proxy.py b/chia/daemon/keychain_proxy.py index e6ac3643bc..5b3010c951 100644 --- a/chia/daemon/keychain_proxy.py +++ b/chia/daemon/keychain_proxy.py @@ -96,7 +96,7 @@ class KeychainProxy(DaemonProxy): self.log.error("Attempting to send request to a keychain-proxy that has shut down.") self.log.debug(f"Sending request to keychain command: {request['command']} from {request['origin']}.") return await super()._get(request) - except asyncio.TimeoutError: + except TimeoutError: raise KeychainProxyConnectionTimeout async def start(self, wait_for_start: bool = False) -> None: diff --git a/chia/data_layer/data_layer.py b/chia/data_layer/data_layer.py index 0a1b5a5f76..4c5f6504d5 100644 --- a/chia/data_layer/data_layer.py +++ b/chia/data_layer/data_layer.py @@ -114,7 +114,7 @@ async def get_plugin_info( if response.status == 200: ret["response"] = json.loads(await response.text()) return plugin_remote, ret - except (asyncio.TimeoutError, aiohttp.ClientError) as e: + except (TimeoutError, aiohttp.ClientError) as e: return plugin_remote, {"error": f"{type(e).__name__}: {e}"} @@ -889,7 +889,7 @@ class DataLayer: self.log.error(f"failed to upload to uploader {uploader}") else: self.log.debug(f"uploaded to uploader {uploader}") - except (asyncio.TimeoutError, aiohttp.ClientError) as e: + except (TimeoutError, aiohttp.ClientError) as e: self.log.error(f"add_missing_files could not reach uploader {uploader}: {type(e).__name__}: {e}") async def subscribe(self, store_id: bytes32, urls: list[str]) -> Subscription: diff --git a/chia/data_layer/data_layer_rpc_util.py b/chia/data_layer/data_layer_rpc_util.py index c98ddc6607..c72163573c 100644 --- a/chia/data_layer/data_layer_rpc_util.py +++ b/chia/data_layer/data_layer_rpc_util.py @@ -1,8 +1,8 @@ from __future__ import annotations -from typing import Any +from typing import Any, Self -from typing_extensions import Protocol, Self +from typing_extensions import Protocol # If accepted for general use then this should be moved to a common location # and probably implemented by the framework instead of manual decoration. diff --git a/chia/data_layer/data_layer_util.py b/chia/data_layer/data_layer_util.py index 475b0fa31f..76fed1f7a4 100644 --- a/chia/data_layer/data_layer_util.py +++ b/chia/data_layer/data_layer_util.py @@ -5,13 +5,12 @@ from dataclasses import dataclass, field from enum import Enum, IntEnum from hashlib import sha256 from pathlib import Path -from typing import TYPE_CHECKING, Any, Union +from typing import TYPE_CHECKING, Any, Union, final import aiosqlite from chia_rs.datalayer import ProofOfInclusion, ProofOfInclusionLayer from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint64 -from typing_extensions import final from chia.data_layer.data_layer_errors import ProofIntegrityError from chia.server.ws_connection import WSChiaConnection diff --git a/chia/data_layer/data_layer_wallet.py b/chia/data_layer/data_layer_wallet.py index 587881df25..9de4c7629e 100644 --- a/chia/data_layer/data_layer_wallet.py +++ b/chia/data_layer/data_layer_wallet.py @@ -2,14 +2,14 @@ from __future__ import annotations import dataclasses import logging -from typing import TYPE_CHECKING, Any, ClassVar, cast +from typing import TYPE_CHECKING, Any, ClassVar, cast, final from chia_rs import BlockRecord, CoinSpend, CoinState, G1Element, G2Element from chia_rs.datalayer import ProofOfInclusion, ProofOfInclusionLayer from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64, uint128 from clvm.EvalError import EvalError -from typing_extensions import Unpack, final +from typing_extensions import Unpack from chia.data_layer.data_layer_errors import LauncherCoinNotFoundError, OfferIntegrityError from chia.data_layer.data_layer_util import OfferStore, StoreProofs, leaf_hash diff --git a/chia/data_layer/dl_wallet_store.py b/chia/data_layer/dl_wallet_store.py index a6d47ffc1e..83159473e0 100644 --- a/chia/data_layer/dl_wallet_store.py +++ b/chia/data_layer/dl_wallet_store.py @@ -1,11 +1,11 @@ from __future__ import annotations import dataclasses +from typing import Self from aiosqlite import Row from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint32, uint64 -from typing_extensions import Self from chia.data_layer.data_layer_wallet import Mirror from chia.data_layer.singleton_record import SingletonRecord diff --git a/chia/data_layer/download_data.py b/chia/data_layer/download_data.py index e04ba0ff40..8726e2513d 100644 --- a/chia/data_layer/download_data.py +++ b/chia/data_layer/download_data.py @@ -1,6 +1,5 @@ from __future__ import annotations -import asyncio import logging import time from dataclasses import dataclass @@ -134,7 +133,7 @@ async def download_file( await http_download( target_filename_path, filename, proxy_url, server_info, timeout, log, max_delta_file_size ) - except (asyncio.TimeoutError, aiohttp.ClientError, MaxDeltaFileSizeExceededError): + except (TimeoutError, aiohttp.ClientError, MaxDeltaFileSizeExceededError): new_server_info = await data_store.server_misses_file(store_id, server_info, timestamp) log.info( f"Failed to download {filename} from {new_server_info.url}." @@ -163,7 +162,7 @@ async def download_file( res_json = await response.json() assert isinstance(res_json["downloaded"], bool) return res_json["downloaded"] - except (asyncio.TimeoutError, aiohttp.ClientError) as e: + except (TimeoutError, aiohttp.ClientError) as e: log.error(f"download_file could not get response from plugin {downloader}: {type(e).__name__}: {e}") return False diff --git a/chia/farmer/farmer.py b/chia/farmer/farmer.py index 9511371c57..fae6d55519 100644 --- a/chia/farmer/farmer.py +++ b/chia/farmer/farmer.py @@ -8,7 +8,7 @@ import time import traceback from collections.abc import AsyncIterator from dataclasses import dataclass -from datetime import datetime, timezone +from datetime import UTC, datetime from math import floor from pathlib import Path from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypeVar, cast @@ -438,8 +438,8 @@ class Farmer: elif pool_config.version == 2: cached_auth_token = self.authentication_tokens.get(pool_config.launcher_id, None) if cached_auth_token is None or datetime.fromtimestamp( - cached_auth_token[1], tz=timezone.utc - ) < datetime.fromtimestamp(self.get_current_time(), tz=timezone.utc): + cached_auth_token[1], tz=UTC + ) < datetime.fromtimestamp(self.get_current_time(), tz=UTC): auth_response = await self._pool_get_auth(pool_config) if isinstance(auth_response, pool_protocol.GetAuthResponse): self.authentication_tokens[pool_config.launcher_id] = ( diff --git a/chia/full_node/full_node_api.py b/chia/full_node/full_node_api.py index 7fe2cf1fae..69a7ef52da 100644 --- a/chia/full_node/full_node_api.py +++ b/chia/full_node/full_node_api.py @@ -6,7 +6,7 @@ import logging import time import traceback from collections.abc import Collection, Sequence -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, ClassVar, cast import anyio @@ -2012,8 +2012,8 @@ class FullNodeAPI: @metadata.request(reply_types=[ProtocolMessageTypes.respond_fee_estimates]) async def request_fee_estimates(self, request: wallet_protocol.RequestFeeEstimates) -> Message: def get_fee_estimates(est: FeeEstimatorInterface, req_times: list[uint64]) -> list[FeeEstimate]: - now = datetime.now(timezone.utc) - utc_time = now.replace(tzinfo=timezone.utc) + now = datetime.now(UTC) + utc_time = now.replace(tzinfo=UTC) utc_now = int(utc_time.timestamp()) deltas = [max(0, req_ts - utc_now) for req_ts in req_times] fee_rates = [est.estimate_fee_rate(time_offset_seconds=d) for d in deltas] diff --git a/chia/full_node/full_node_rpc_api.py b/chia/full_node/full_node_rpc_api.py index 39ab10d625..383771c9fd 100644 --- a/chia/full_node/full_node_rpc_api.py +++ b/chia/full_node/full_node_rpc_api.py @@ -1,7 +1,7 @@ from __future__ import annotations import time -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, ClassVar, cast from chia_rs import ( @@ -1153,8 +1153,8 @@ class FullNodeRpcApi: last_tx_block_fees = last_tx_block.fees last_tx_block_height = last_tx_block.height - dt = datetime.now(timezone.utc) - utc_time = dt.replace(tzinfo=timezone.utc) + dt = datetime.now(UTC) + utc_time = dt.replace(tzinfo=UTC) utc_timestamp = utc_time.timestamp() return { diff --git a/chia/full_node/mempool_manager.py b/chia/full_node/mempool_manager.py index 40c0267885..36ed2da7c6 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -7,7 +7,7 @@ from collections.abc import AsyncIterator, Awaitable, Callable, Collection from dataclasses import dataclass, field from pathlib import Path from types import TracebackType -from typing import Literal, TypeVar +from typing import Literal, Self, TypeVar from chia_rs import ( ELIGIBLE_FOR_DEDUP, @@ -26,7 +26,6 @@ from chia_rs import ( from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 from chiabip158 import PyBIP158 -from typing_extensions import Self from chia.consensus.block_record import BlockRecordProtocol from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator diff --git a/chia/plotting/util.py b/chia/plotting/util.py index 65e2ad58c5..7c782df616 100644 --- a/chia/plotting/util.py +++ b/chia/plotting/util.py @@ -9,10 +9,11 @@ from typing import TYPE_CHECKING, Any if TYPE_CHECKING: from chia.plotting.prover import ProverProtocol +from typing import final + from chia_rs import G1Element, PrivateKey from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32 -from typing_extensions import final from chia.util.config import load_config, lock_and_load_config, save_config from chia.util.harvester_config import get_plot_directories diff --git a/chia/pools/plotnft_drivers.py b/chia/pools/plotnft_drivers.py index b4a649d811..b9d70728a9 100644 --- a/chia/pools/plotnft_drivers.py +++ b/chia/pools/plotnft_drivers.py @@ -3,13 +3,12 @@ from __future__ import annotations import dataclasses from dataclasses import dataclass, field, replace from functools import cached_property -from typing import ClassVar +from typing import ClassVar, Self from chia_rs import G1Element from chia_rs.chia_rs import Coin, CoinSpend from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 -from typing_extensions import Self from chia.types.blockchain_format.program import Program, run from chia.types.coin_spend import make_spend diff --git a/chia/pools/pool_config.py b/chia/pools/pool_config.py index ab0d90125a..350cac97c0 100644 --- a/chia/pools/pool_config.py +++ b/chia/pools/pool_config.py @@ -4,13 +4,12 @@ from collections.abc import Iterator from contextlib import contextmanager from dataclasses import dataclass from pathlib import Path -from typing import TypedDict +from typing import NotRequired, Self, TypedDict import yaml from chia_rs import G1Element from chia_rs.sized_byte_class import hexstr_to_bytes from chia_rs.sized_bytes import bytes32 -from typing_extensions import NotRequired, Self from chia.util.config import lock_and_load_config, save_config from chia.util.lock import Lockfile diff --git a/chia/pools/pool_wallet.py b/chia/pools/pool_wallet.py index e3c8945ae2..802018043c 100644 --- a/chia/pools/pool_wallet.py +++ b/chia/pools/pool_wallet.py @@ -2,12 +2,12 @@ from __future__ import annotations import dataclasses import logging -from typing import TYPE_CHECKING, Any, ClassVar, cast +from typing import TYPE_CHECKING, Any, ClassVar, cast, final from chia_rs import CoinSpend, G1Element, G2Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64, uint128 -from typing_extensions import Unpack, final +from typing_extensions import Unpack from chia.pools.pool_config import PoolingShareState from chia.pools.pool_puzzles import ( diff --git a/chia/rpc/rpc_client.py b/chia/rpc/rpc_client.py index 7fcc89758c..3f1a911daa 100644 --- a/chia/rpc/rpc_client.py +++ b/chia/rpc/rpc_client.py @@ -7,12 +7,11 @@ from contextlib import asynccontextmanager from dataclasses import dataclass from pathlib import Path from ssl import SSLContext -from typing import Any +from typing import Any, Self import aiohttp from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16 -from typing_extensions import Self from chia.protocols.outbound_message import NodeType from chia.server.server import ssl_context_for_client diff --git a/chia/rpc/rpc_server.py b/chia/rpc/rpc_server.py index cb5256a99e..57b221764c 100644 --- a/chia/rpc/rpc_server.py +++ b/chia/rpc/rpc_server.py @@ -4,14 +4,13 @@ import asyncio import contextlib import json import logging -import sys import traceback from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass, field from pathlib import Path from ssl import SSLContext from types import MethodType -from typing import Any, ClassVar, Generic, TypeVar +from typing import Any, ClassVar, Generic, TypeVar, final from aiohttp import ( ClientConnectorError, @@ -21,7 +20,7 @@ from aiohttp import ( web, ) from chia_rs.sized_ints import uint16 -from typing_extensions import Protocol, final +from typing_extensions import Protocol from chia import __version__ from chia.protocols.outbound_message import NodeType @@ -356,10 +355,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]): level_number = logger.level level_name = logging.getLevelName(level_number) - if sys.version_info >= (3, 11): - map = logging.getLevelNamesMapping() - else: - map = logging._nameToLevel + map = logging.getLevelNamesMapping() return { "success": True, diff --git a/chia/seeder/crawler.py b/chia/seeder/crawler.py index 8cb5fc9516..95457ae554 100644 --- a/chia/seeder/crawler.py +++ b/chia/seeder/crawler.py @@ -92,7 +92,7 @@ class Crawler: if self.crawl_task is not None: try: await asyncio.wait_for(self.crawl_task, timeout=10) # wait 10 seconds before giving up - except asyncio.TimeoutError: + except TimeoutError: self.log.error("Crawl task did not exit in time, killing task.") self.crawl_task.cancel() if self.crawl_store is not None: diff --git a/chia/seeder/dns_server.py b/chia/seeder/dns_server.py index 1a39d187e1..23a63155e2 100644 --- a/chia/seeder/dns_server.py +++ b/chia/seeder/dns_server.py @@ -208,7 +208,7 @@ class TCPDNSServerProtocol(asyncio.BufferedProtocol): """ try: await asyncio.wait_for(asyncio.gather(*self.futures), timeout=10) - except asyncio.TimeoutError: + except TimeoutError: log.warning(f"Timed out waiting for DNS replies to be sent to {self.peer_info}.") if self.transport is not None: self.transport.close() diff --git a/chia/server/server.py b/chia/server/server.py index 71da97d45a..786e487863 100644 --- a/chia/server/server.py +++ b/chia/server/server.py @@ -9,7 +9,7 @@ from collections.abc import Awaitable, Callable from dataclasses import dataclass, field from ipaddress import IPv4Network, IPv6Network, ip_network from pathlib import Path -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, cast, final from aiohttp import ( ClientResponseError, @@ -25,7 +25,6 @@ from chia_rs.sized_ints import uint16 from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes, serialization -from typing_extensions import final from chia.protocols.outbound_message import Message, NodeType from chia.protocols.protocol_message_types import ProtocolMessageTypes @@ -380,7 +379,7 @@ class ChiaServer: await self.connection_added(connection, self.on_connect) if self.introducer_peers is not None and connection.connection_type is NodeType.FULL_NODE: self.introducer_peers.add(connection.get_peer_info()) - except asyncio.TimeoutError: + except TimeoutError: if connection is not None: await connection.close( self.invalid_protocol_ban_seconds, WSCloseCode.PROTOCOL_ERROR, Err.INVALID_HANDSHAKE @@ -494,7 +493,7 @@ class ChiaServer: except ClientResponseError as e: self.log.warning(f"Connection failed to {url}. Error: {e}") return False - except asyncio.TimeoutError: + except TimeoutError: self.log.debug(f"Timeout error connecting to {url}") return False if ws is None: @@ -561,7 +560,7 @@ class ChiaServer: self.log.debug(f"Feeler connection error. {e}") else: self.log.info(f"{e}") - except asyncio.TimeoutError: + except TimeoutError: if connection is not None: await connection.close() self.log.debug(f"Handshake timeout connecting to {target_node}") diff --git a/chia/server/ws_connection.py b/chia/server/ws_connection.py index 667a1c2013..55ab5cbc49 100644 --- a/chia/server/ws_connection.py +++ b/chia/server/ws_connection.py @@ -9,7 +9,7 @@ import unicodedata from collections.abc import Awaitable, Callable from dataclasses import dataclass, field from ipaddress import IPv4Network, IPv6Network -from typing import Any +from typing import Any, final from aiohttp import ClientSession, WebSocketError, WSCloseCode, WSMsgType from aiohttp.client import ClientWebSocketResponse @@ -17,7 +17,7 @@ from aiohttp.web import WebSocketResponse from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import int16, uint8, uint16 from packaging.version import Version -from typing_extensions import Protocol, final +from typing_extensions import Protocol from chia import __version__ from chia.protocols.outbound_message import Message, NodeType, make_msg @@ -767,7 +767,7 @@ class WSChiaConnection: try: await asyncio.wait_for(event.wait(), timeout=timeout) - except asyncio.TimeoutError: + except TimeoutError: self.log.debug(f"Request timeout: {message}") result = self.request_results.pop(message.id, None) diff --git a/chia/simulator/block_tools.py b/chia/simulator/block_tools.py index 7bddc27bc7..9903a74964 100644 --- a/chia/simulator/block_tools.py +++ b/chia/simulator/block_tools.py @@ -17,7 +17,7 @@ from functools import lru_cache from pathlib import Path from random import Random from types import TracebackType -from typing import Any +from typing import Any, Self import anyio from chia_puzzles_py.programs import CHIALISP_DESERIALISATION, ROM_BOOTSTRAP_GENERATOR @@ -46,7 +46,6 @@ from chia_rs import ( from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16, uint32, uint64, uint128 from filelock import FileLock -from typing_extensions import Self from chia.consensus.block_creation import ( calculate_infusion_point_total_iters, diff --git a/chia/ssl/create_ssl.py b/chia/ssl/create_ssl.py index 7232c2ddf5..11eb3e9427 100644 --- a/chia/ssl/create_ssl.py +++ b/chia/ssl/create_ssl.py @@ -119,8 +119,8 @@ def make_ca_cert(cert_path: Path, key_path: Path): .issuer_name(issuer) .public_key(root_key.public_key()) .serial_number(x509.random_serial_number()) - .not_valid_before(datetime.datetime.now(datetime.timezone.utc)) - .not_valid_after(datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=3650)) + .not_valid_before(datetime.datetime.now(datetime.UTC)) + .not_valid_after(datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=3650)) .add_extension(x509.BasicConstraints(ca=True, path_length=None), critical=True) .sign(root_key, hashes.SHA256(), default_backend()) ) diff --git a/chia/types/blockchain_format/program.py b/chia/types/blockchain_format/program.py index 39d4f1fa0c..daa9c59781 100644 --- a/chia/types/blockchain_format/program.py +++ b/chia/types/blockchain_format/program.py @@ -2,7 +2,7 @@ from __future__ import annotations import io from collections.abc import Callable -from typing import TYPE_CHECKING, Any, ClassVar, TypeVar +from typing import TYPE_CHECKING, Any, ClassVar, Self, TypeVar from chia_rs import MEMPOOL_MODE, run_chia_program, tree_hash from chia_rs.sized_bytes import bytes32 @@ -10,7 +10,6 @@ from clvm.CLVMObject import CLVMStorage from clvm.EvalError import EvalError from clvm.serialize import sexp_from_stream, sexp_to_stream from clvm.SExp import SExp -from typing_extensions import Self from chia.types.blockchain_format.serialized_program import SerializedProgram from chia.types.blockchain_format.tree_hash import sha256_treehash diff --git a/chia/util/action_scope.py b/chia/util/action_scope.py index 4b889a1f6b..3cd7accd67 100644 --- a/chia/util/action_scope.py +++ b/chia/util/action_scope.py @@ -4,9 +4,7 @@ import contextlib import copy from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass, field -from typing import Generic, TypeVar - -from typing_extensions import Self +from typing import Generic, Self, TypeVar _T_SideEffects = TypeVar("_T_SideEffects") _T_Config = TypeVar("_T_Config") diff --git a/chia/util/db_wrapper.py b/chia/util/db_wrapper.py index efb43307f7..682ebb1b20 100644 --- a/chia/util/db_wrapper.py +++ b/chia/util/db_wrapper.py @@ -6,16 +6,14 @@ import functools import logging import secrets import sqlite3 -import sys from collections.abc import AsyncIterator, Iterable, Iterator from dataclasses import dataclass, field from datetime import datetime from pathlib import Path -from typing import Any, TextIO +from typing import Any, TextIO, final import aiosqlite import anyio -from typing_extensions import final if aiosqlite.sqlite_version_info < (3, 32, 0): SQLITE_MAX_VARIABLE_NUMBER = 900 @@ -158,18 +156,9 @@ def sql_trace_callback(req: str, file: TextIO, name: str | None = None) -> None: def get_host_parameter_limit() -> int: # NOTE: This does not account for dynamically adjusted limits since it makes a # separate db and connection. If aiosqlite adds support we should use it. - if sys.version_info >= (3, 11): - with contextlib.closing(sqlite3.connect(":memory:")) as connection: - limit_number = sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER - host_parameter_limit = connection.getlimit(limit_number) - # guessing based on defaults, seems you can't query - - # https://www.sqlite.org/changes.html#version_3_32_0 - # Increase the default upper bound on the number of parameters from 999 to 32766. - elif sqlite3.sqlite_version_info >= (3, 32, 0): - host_parameter_limit = 32766 - else: - host_parameter_limit = 999 + with contextlib.closing(sqlite3.connect(":memory:")) as connection: + limit_number = sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER + host_parameter_limit = connection.getlimit(limit_number) return host_parameter_limit @@ -182,10 +171,9 @@ def _suppress_task_cancellation() -> Iterator[None]: 1. ``anyio.CancelScope(shield=True)`` — prevents NEW ``task.cancel()`` calls from anyio's cancellation delivery (e.g. scope timeouts, task group cancellation) during the await. - 2. ``task.uncancel()`` (Python 3.11+) — clears any ALREADY-PENDING - ``_must_cancel`` flag so the await is not immediately interrupted. - On exit, the flag is re-applied so cancellation fires at the next - *unprotected* await point. + 2. ``task.uncancel()`` — clears any ALREADY-PENDING ``_must_cancel`` flag + so the await is not immediately interrupted. On exit, the flag is + re-applied so cancellation fires at the next *unprotected* await point. The anyio shield alone is insufficient because its ``_restart_cancellation_in_parent()`` re-calls ``task.cancel()`` when @@ -196,17 +184,13 @@ def _suppress_task_cancellation() -> Iterator[None]: outside anyio's scope tree (e.g. ``ws_connection.cancel_tasks()``). Callers that need to handle that case should place the protected await inside a try/except/finally for cleanup. - - On Python < 3.11 (which lacks ``task.cancelling()``/``task.uncancel()``), - only the anyio shield is active. """ task = asyncio.current_task() assert task is not None saved = 0 - if sys.version_info >= (3, 11): - while task.cancelling() > 0: - task.uncancel() - saved += 1 + while task.cancelling() > 0: + task.uncancel() + saved += 1 with anyio.CancelScope(shield=True): try: yield diff --git a/chia/util/file_keyring.py b/chia/util/file_keyring.py index dcd4427ce3..a0415de328 100644 --- a/chia/util/file_keyring.py +++ b/chia/util/file_keyring.py @@ -10,11 +10,10 @@ from dataclasses import asdict, dataclass, field from hashlib import pbkdf2_hmac from pathlib import Path from secrets import token_bytes -from typing import Any, cast +from typing import Any, cast, final import yaml from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305 # pyright: reportMissingModuleSource=false -from typing_extensions import final from watchdog.events import DirModifiedEvent, FileSystemEvent, FileSystemEventHandler from watchdog.observers import Observer from watchdog.observers.api import BaseObserver diff --git a/chia/util/keychain.py b/chia/util/keychain.py index 09c2cc8eb7..87852495af 100644 --- a/chia/util/keychain.py +++ b/chia/util/keychain.py @@ -6,14 +6,13 @@ from collections.abc import Iterator from dataclasses import dataclass from hashlib import pbkdf2_hmac from pathlib import Path -from typing import Any, Literal, overload +from typing import Any, Literal, final, overload import importlib_resources from bitstring import BitArray # pyright: reportMissingImports=false from chia_rs import AugSchemeMPL, G1Element, PrivateKey # pyright: reportMissingImports=false from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32 -from typing_extensions import final from chia.util.bech32m import bech32_decode, convertbits from chia.util.byte_types import hexstr_to_bytes diff --git a/chia/util/limited_semaphore.py b/chia/util/limited_semaphore.py index dafb557845..f3ef980ada 100644 --- a/chia/util/limited_semaphore.py +++ b/chia/util/limited_semaphore.py @@ -4,8 +4,7 @@ import asyncio import contextlib from collections.abc import AsyncIterator from dataclasses import dataclass - -from typing_extensions import final +from typing import final class LimitedSemaphoreFullError(Exception): diff --git a/chia/util/lock.py b/chia/util/lock.py index 80a823a1de..b7fc2947f4 100644 --- a/chia/util/lock.py +++ b/chia/util/lock.py @@ -3,9 +3,9 @@ from __future__ import annotations from dataclasses import dataclass from pathlib import Path from types import TracebackType +from typing import final from filelock import BaseFileLock, FileLock, Timeout -from typing_extensions import final class LockfileError(Exception): diff --git a/chia/util/network.py b/chia/util/network.py index b8c18d48b7..98cbc0154a 100644 --- a/chia/util/network.py +++ b/chia/util/network.py @@ -8,14 +8,13 @@ import ssl from collections.abc import Iterable from dataclasses import dataclass from ipaddress import IPv4Network, IPv6Network, ip_address -from typing import Any, Literal +from typing import Any, Literal, final from urllib.parse import urlsplit from aiohttp import web from aiohttp.log import web_logger from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16 -from typing_extensions import final from chia.util.ip_address import IPAddress from chia.util.task_referencer import create_referenced_task diff --git a/chia/util/priority_mutex.py b/chia/util/priority_mutex.py index a3f2063948..78f6e84333 100644 --- a/chia/util/priority_mutex.py +++ b/chia/util/priority_mutex.py @@ -7,9 +7,7 @@ import dataclasses import logging from collections.abc import AsyncIterator from enum import IntEnum -from typing import Generic, TypeVar - -from typing_extensions import final +from typing import Generic, TypeVar, final log = logging.getLogger(__name__) diff --git a/chia/util/priority_thread_pool_executor.py b/chia/util/priority_thread_pool_executor.py index bfd08876d1..30f4251447 100644 --- a/chia/util/priority_thread_pool_executor.py +++ b/chia/util/priority_thread_pool_executor.py @@ -9,9 +9,7 @@ from collections.abc import Callable from concurrent.futures import Future from dataclasses import dataclass, field from types import TracebackType -from typing import Any, Protocol, runtime_checkable - -from typing_extensions import Self +from typing import Any, Protocol, Self, runtime_checkable log = logging.getLogger(__name__) diff --git a/chia/util/streamable.py b/chia/util/streamable.py index 03216ac916..63164c7c90 100644 --- a/chia/util/streamable.py +++ b/chia/util/streamable.py @@ -16,6 +16,7 @@ from typing import ( BinaryIO, ClassVar, Literal, + Self, TypeVar, Union, get_args, @@ -25,7 +26,6 @@ from typing import ( from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint32, uint64 -from typing_extensions import Self from chia.util.byte_types import hexstr_to_bytes from chia.util.hash import std_hash diff --git a/chia/wallet/cat_wallet/cat_wallet.py b/chia/wallet/cat_wallet/cat_wallet.py index 93ccb2e15e..f16d5f7367 100644 --- a/chia/wallet/cat_wallet/cat_wallet.py +++ b/chia/wallet/cat_wallet/cat_wallet.py @@ -4,12 +4,12 @@ import dataclasses import logging import time import traceback -from typing import TYPE_CHECKING, Any, ClassVar, cast +from typing import TYPE_CHECKING, Any, ClassVar, Self, cast from chia_rs import CoinSpend, CoinState, G1Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64, uint128 -from typing_extensions import Self, Unpack +from typing_extensions import Unpack from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.server.ws_connection import WSChiaConnection diff --git a/chia/wallet/cat_wallet/r_cat_wallet.py b/chia/wallet/cat_wallet/r_cat_wallet.py index 81531061eb..031003bf0c 100644 --- a/chia/wallet/cat_wallet/r_cat_wallet.py +++ b/chia/wallet/cat_wallet/r_cat_wallet.py @@ -3,13 +3,12 @@ from __future__ import annotations import logging from dataclasses import dataclass from enum import IntEnum -from typing import TYPE_CHECKING, Any, ClassVar, cast +from typing import TYPE_CHECKING, Any, ClassVar, Self, cast from chia_rs import G1Element from chia_rs.sized_byte_class import hexstr_to_bytes from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16 -from typing_extensions import Self from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program diff --git a/chia/wallet/conditions.py b/chia/wallet/conditions.py index 0db797754f..5d9868c37e 100644 --- a/chia/wallet/conditions.py +++ b/chia/wallet/conditions.py @@ -3,12 +3,11 @@ from __future__ import annotations from abc import ABC, abstractmethod from collections.abc import Iterable from dataclasses import dataclass, fields, replace -from typing import Any, ClassVar, TypeVar, final, get_type_hints +from typing import Any, ClassVar, Self, TypeVar, final, get_type_hints from chia_rs import Coin, G1Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64 -from typing_extensions import Self from chia.types.blockchain_format.program import Program from chia.types.condition_opcodes import ConditionOpcode diff --git a/chia/wallet/key_val_store.py b/chia/wallet/key_val_store.py index d424108ef6..07d6e816d9 100644 --- a/chia/wallet/key_val_store.py +++ b/chia/wallet/key_val_store.py @@ -1,8 +1,6 @@ from __future__ import annotations -from typing import Protocol, TypeVar - -from typing_extensions import Self +from typing import Protocol, Self, TypeVar from chia.util.db_wrapper import DBWrapper2 diff --git a/chia/wallet/nft_wallet/nft_puzzle_utils.py b/chia/wallet/nft_wallet/nft_puzzle_utils.py index bb652e472a..63d39f4ec6 100644 --- a/chia/wallet/nft_wallet/nft_puzzle_utils.py +++ b/chia/wallet/nft_wallet/nft_puzzle_utils.py @@ -2,12 +2,11 @@ from __future__ import annotations import logging from dataclasses import dataclass -from typing import Any, ClassVar, Literal +from typing import Any, ClassVar, Literal, Self from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint64 from clvm_tools.binutils import disassemble -from typing_extensions import Self from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.serialized_program import SerializedProgram diff --git a/chia/wallet/nft_wallet/uncurry_nft.py b/chia/wallet/nft_wallet/uncurry_nft.py index dc5b4bd2ee..1aed1055ab 100644 --- a/chia/wallet/nft_wallet/uncurry_nft.py +++ b/chia/wallet/nft_wallet/uncurry_nft.py @@ -2,11 +2,11 @@ from __future__ import annotations import logging from dataclasses import dataclass +from typing import Self from chia_rs import CoinSpend, CoinState from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16 -from typing_extensions import Self from chia.types.blockchain_format.program import Program from chia.util.streamable import Streamable, streamable diff --git a/chia/wallet/plotnft_wallet/plotnft_store.py b/chia/wallet/plotnft_wallet/plotnft_store.py index 4ecd6bd7c8..db8c7c07b0 100644 --- a/chia/wallet/plotnft_wallet/plotnft_store.py +++ b/chia/wallet/plotnft_wallet/plotnft_store.py @@ -2,11 +2,11 @@ from __future__ import annotations from collections.abc import AsyncGenerator from sqlite3 import Row +from typing import Self from chia_rs import Coin, G1Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 -from typing_extensions import Self from chia.pools.plotnft_drivers import PlotNFT, PoolConfig, PoolReward, UserConfig from chia.types.blockchain_format.program import Program diff --git a/chia/wallet/plotnft_wallet/plotnft_wallet.py b/chia/wallet/plotnft_wallet/plotnft_wallet.py index b5f2ecb635..627e0d3df0 100644 --- a/chia/wallet/plotnft_wallet/plotnft_wallet.py +++ b/chia/wallet/plotnft_wallet/plotnft_wallet.py @@ -2,13 +2,13 @@ from __future__ import annotations import dataclasses import logging -from typing import TYPE_CHECKING, ClassVar, cast, final +from typing import TYPE_CHECKING, ClassVar, Self, cast, final from chia_rs import CoinSpend, G2Element from chia_rs.chia_rs import Coin, G1Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64, uint128 -from typing_extensions import Self, Unpack +from typing_extensions import Unpack from chia.pools.plotnft_drivers import ( GetNextPlotNFTError, diff --git a/chia/wallet/puzzle_drivers.py b/chia/wallet/puzzle_drivers.py index ae8dd91103..75f768bc91 100644 --- a/chia/wallet/puzzle_drivers.py +++ b/chia/wallet/puzzle_drivers.py @@ -1,11 +1,10 @@ from __future__ import annotations -from typing import Any +from typing import Any, Self from clvm.SExp import SExp from clvm_tools.binutils import assemble, type_for_atom from ir.Type import Type -from typing_extensions import Self from chia.types.blockchain_format.program import Program from chia.util.byte_types import hexstr_to_bytes diff --git a/chia/wallet/trade_record.py b/chia/wallet/trade_record.py index a7025985d0..162584eabf 100644 --- a/chia/wallet/trade_record.py +++ b/chia/wallet/trade_record.py @@ -1,11 +1,10 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any +from typing import Any, Self from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64 -from typing_extensions import Self from chia.types.blockchain_format.coin import Coin from chia.util.streamable import Streamable, streamable diff --git a/chia/wallet/util/tx_config.py b/chia/wallet/util/tx_config.py index e92f17cbfc..4a8261c4f4 100644 --- a/chia/wallet/util/tx_config.py +++ b/chia/wallet/util/tx_config.py @@ -1,12 +1,12 @@ from __future__ import annotations import dataclasses -from typing import Any +from typing import Any, NotRequired, Self from chia_rs import ConsensusConstants from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint64 -from typing_extensions import NotRequired, Self, TypedDict, Unpack +from typing_extensions import TypedDict, Unpack from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.coin import Coin diff --git a/chia/wallet/vc_wallet/cr_cat_drivers.py b/chia/wallet/vc_wallet/cr_cat_drivers.py index 9bd64bdef1..9cceb9b800 100644 --- a/chia/wallet/vc_wallet/cr_cat_drivers.py +++ b/chia/wallet/vc_wallet/cr_cat_drivers.py @@ -4,6 +4,7 @@ import functools from collections.abc import Iterable from dataclasses import dataclass, replace from enum import IntEnum +from typing import Self from chia_puzzles_py.programs import ( CONDITIONS_W_FEE_ANNOUNCE, @@ -18,7 +19,6 @@ from chia_puzzles_py.programs import ( from chia_rs import CoinSpend from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint64 -from typing_extensions import Self from chia.types.blockchain_format.coin import Coin, coin_as_list from chia.types.blockchain_format.program import Program diff --git a/chia/wallet/vc_wallet/cr_cat_wallet.py b/chia/wallet/vc_wallet/cr_cat_wallet.py index 2c2731840a..4d369cf6d9 100644 --- a/chia/wallet/vc_wallet/cr_cat_wallet.py +++ b/chia/wallet/vc_wallet/cr_cat_wallet.py @@ -3,12 +3,12 @@ from __future__ import annotations import logging import time import traceback -from typing import TYPE_CHECKING, Any, ClassVar +from typing import TYPE_CHECKING, Any, ClassVar, Self from chia_rs import CoinSpend, G1Element, G2Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64, uint128 -from typing_extensions import Self, Unpack +from typing_extensions import Unpack from chia.server.ws_connection import WSChiaConnection from chia.types.blockchain_format.coin import Coin, coin_as_list diff --git a/chia/wallet/vc_wallet/vc_drivers.py b/chia/wallet/vc_wallet/vc_drivers.py index 70d965cf7f..2c2fa072eb 100644 --- a/chia/wallet/vc_wallet/vc_drivers.py +++ b/chia/wallet/vc_wallet/vc_drivers.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass, replace -from typing import Any, Generic, TypeVar, final +from typing import Any, Generic, Self, TypeVar, final from chia_puzzles_py.programs import ACS_TRANSFER_PROGRAM as ACS_TRANSFER_PROGRAM_BYTES from chia_puzzles_py.programs import COVENANT_LAYER as COVENANT_LAYER_BYTES @@ -23,7 +23,6 @@ from chia_puzzles_py.programs import STD_PARENT_MORPHER_HASH as STD_PARENT_MORPH from chia_rs import CoinSpend from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint64 -from typing_extensions import Self from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program diff --git a/chia/wallet/vc_wallet/vc_store.py b/chia/wallet/vc_wallet/vc_store.py index 68c9dd1f30..a261274b83 100644 --- a/chia/wallet/vc_wallet/vc_store.py +++ b/chia/wallet/vc_wallet/vc_store.py @@ -2,11 +2,11 @@ from __future__ import annotations import dataclasses from functools import cmp_to_key +from typing import Self from aiosqlite import Row from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 -from typing_extensions import Self from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program diff --git a/chia/wallet/wallet_nft_store.py b/chia/wallet/wallet_nft_store.py index 4f818655e2..bbed017060 100644 --- a/chia/wallet/wallet_nft_store.py +++ b/chia/wallet/wallet_nft_store.py @@ -3,10 +3,10 @@ from __future__ import annotations import json import logging from sqlite3 import Row +from typing import Self from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32 -from typing_extensions import Self from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program diff --git a/chia/wallet/wallet_protocol.py b/chia/wallet/wallet_protocol.py index e565926ab9..ab69bc3309 100644 --- a/chia/wallet/wallet_protocol.py +++ b/chia/wallet/wallet_protocol.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, TypeVar, runtime_checkable +from typing import TYPE_CHECKING, Any, NotRequired, TypeVar, runtime_checkable from chia_rs import G1Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64, uint128 -from typing_extensions import NotRequired, Protocol, TypedDict, Unpack +from typing_extensions import Protocol, TypedDict, Unpack from chia.server.ws_connection import WSChiaConnection from chia.types.blockchain_format.coin import Coin diff --git a/chia/wallet/wallet_request_types.py b/chia/wallet/wallet_request_types.py index b32d5a2f47..15adfb226e 100644 --- a/chia/wallet/wallet_request_types.py +++ b/chia/wallet/wallet_request_types.py @@ -4,12 +4,11 @@ from copy import deepcopy from dataclasses import dataclass, field, fields from enum import Enum from functools import cached_property -from typing import Any, BinaryIO, TypeVar, final +from typing import Any, BinaryIO, Self, TypeVar, final from chia_rs import Coin, CoinRecord, G1Element, G2Element, PrivateKey from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16, uint32, uint64 -from typing_extensions import Self from chia.data_layer.data_layer_wallet import DataLayerSummary, Mirror from chia.data_layer.singleton_record import SingletonRecord diff --git a/chia/wallet/wallet_rpc_api.py b/chia/wallet/wallet_rpc_api.py index c5a24b4ef8..14101a7275 100644 --- a/chia/wallet/wallet_rpc_api.py +++ b/chia/wallet/wallet_rpc_api.py @@ -4,7 +4,7 @@ import dataclasses import json import logging from collections.abc import Callable -from datetime import datetime, timezone +from datetime import UTC, datetime from itertools import count from pathlib import Path from types import MethodType @@ -942,7 +942,7 @@ class WalletRpcApi: except ValueError as e: raise ValueError("Wallet is not currently connected to any full node peers") from e - now_utc: int = int(datetime.now(timezone.utc).timestamp()) + now_utc: int = int(datetime.now(UTC).timestamp()) time_targets = [uint64(now_utc)] fee_estimate_group = await self.service.request_fee_estimates(peer, time_targets) diff --git a/chia/wallet/wallet_transaction_store.py b/chia/wallet/wallet_transaction_store.py index ef8627c611..b768eb411f 100644 --- a/chia/wallet/wallet_transaction_store.py +++ b/chia/wallet/wallet_transaction_store.py @@ -3,11 +3,11 @@ from __future__ import annotations import dataclasses import logging import time +from typing import Any import aiosqlite from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32 -from typing_extensions import Any from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.util.bech32m import encode_puzzle_hash diff --git a/chia/wallet/wallet_user_store.py b/chia/wallet/wallet_user_store.py index 822ac263be..49acf1655d 100644 --- a/chia/wallet/wallet_user_store.py +++ b/chia/wallet/wallet_user_store.py @@ -1,7 +1,8 @@ from __future__ import annotations +from typing import Self + from chia_rs.sized_ints import uint32 -from typing_extensions import Self from chia.util.db_wrapper import DBWrapper2, execute_fetchone from chia.wallet.util.wallet_types import WalletType diff --git a/install.sh b/install.sh index 70c0c5b7e3..76b54e368e 100755 --- a/install.sh +++ b/install.sh @@ -58,7 +58,7 @@ if [ "$(uname -m)" = "armv7l" ]; then fi # You can specify preferred python version by exporting `INSTALL_PYTHON_VERSION` -# e.g. `export INSTALL_PYTHON_VERSION=3.10` +# e.g. `export INSTALL_PYTHON_VERSION=3.11` INSTALL_PYTHON_PATH= PYTHON_MAJOR_VER= PYTHON_MINOR_VER= @@ -71,7 +71,7 @@ OPENSSL_VERSION_INT= find_python() { set +e unset BEST_VERSION - for V in 314 3.14 313 3.13 312 3.12 311 3.11 310 3.10 3; do + for V in 314 3.14 313 3.13 312 3.12 311 3.11 3; do if command -v python$V >/dev/null; then if [ "$BEST_VERSION" = "" ]; then BEST_VERSION=$V @@ -134,8 +134,8 @@ if ! command -v "$INSTALL_PYTHON_PATH" >/dev/null; then exit 1 fi -if [ "$PYTHON_MAJOR_VER" -ne "3" ] || [ "$PYTHON_MINOR_VER" -lt "10" ] || [ "$PYTHON_MINOR_VER" -ge "15" ]; then - echo "Chia requires Python version >= 3.10 and < 3.15.0" >&2 +if [ "$PYTHON_MAJOR_VER" -ne "3" ] || [ "$PYTHON_MINOR_VER" -lt "11" ] || [ "$PYTHON_MINOR_VER" -ge "15" ]; then + echo "Chia requires Python version >= 3.11 and < 3.15.0" >&2 echo "Current Python version = $INSTALL_PYTHON_VERSION" >&2 # If Arch, direct to Arch Wiki if type pacman >/dev/null 2>&1 && [ -f "/etc/arch-release" ]; then diff --git a/poetry.lock b/poetry.lock index 90923e2f3b..df6df27f3f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -156,7 +156,6 @@ files = [ [package.dependencies] aiohappyeyeballs = ">=2.5.0" aiosignal = ">=1.4.0" -async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -241,7 +240,6 @@ files = [ ] [package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" typing_extensions = {version = ">=4.16.0", markers = "python_version < \"3.15\""} @@ -375,19 +373,6 @@ files = [ {file = "ast_serialize-0.8.0.tar.gz", hash = "sha256:6c37c43e4004dfb42d321ddedc569dc17ff4259296f3af577c9ea46a809bc010"}, ] -[[package]] -name = "async-timeout" -version = "5.0.1" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, - {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, -] - [[package]] name = "attrs" version = "25.4.0" @@ -407,7 +392,7 @@ description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.12\"" +markers = "python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -1119,10 +1104,8 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "os_name == \"nt\""} -importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} packaging = ">=24.0" pyproject_hooks = "*" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] keyring = ["keyring"] @@ -1884,9 +1867,6 @@ files = [ {file = "coverage-7.16.1.tar.gz", hash = "sha256:f83981779bcf9dfa06fa0a8d4cb43e0faec1706328ce07aa3e7b665b4ac0f210"}, ] -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - [package.extras] toml = ["tomli ; python_full_version <= \"3.11.0a6\""] @@ -1949,7 +1929,6 @@ files = [ [package.dependencies] cffi = {version = ">=2.0.0", markers = "platform_python_implementation != \"PyPy\""} -typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""} [package.extras] ssh = ["bcrypt (>=3.1.5)"] @@ -1969,7 +1948,6 @@ files = [ [package.dependencies] cffi = {version = ">=2.0.0", markers = "platform_python_implementation != \"PyPy\""} -typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""} [package.extras] ssh = ["bcrypt (>=3.1.5)"] @@ -2060,25 +2038,6 @@ idna = ["idna (>=3.10)"] trio = ["trio (>=0.30)"] wmi = ["wmi (>=1.5.1) ; platform_system == \"Windows\""] -[[package]] -name = "exceptiongroup" -version = "1.3.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, - {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "execnet" version = "2.1.2" @@ -3293,9 +3252,6 @@ files = [ {file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} - [[package]] name = "mypy" version = "2.3.1" @@ -3364,7 +3320,6 @@ ast-serialize = ">=0.6.0,<1.0.0" librt = {version = ">=0.13.0", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing_extensions = [ {version = ">=4.6.0", markers = "python_version < \"3.15\""}, {version = ">=4.14.0", markers = "python_version >= \"3.15\""}, @@ -4063,12 +4018,10 @@ files = [ [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} iniconfig = ">=1" packaging = ">=20" pluggy = ">=1.5,<2" pygments = ">=2.7.2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] @@ -4717,10 +4670,10 @@ dev = ["build", "hypothesis (>=6.151.0)", "pyright (>=1.1.389)", "pytest (>=9.0. name = "tomli" version = "2.4.0" description = "A lil' TOML parser" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"dev\" or python_version == \"3.10\"" +markers = "extra == \"dev\"" files = [ {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, @@ -4987,7 +4940,6 @@ files = [ distlib = ">=0.3.7,<1" filelock = {version = ">=3.20.1,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" -typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] @@ -5240,7 +5192,7 @@ description = "ZSTD Bindings for Python" optional = false python-versions = "*" groups = ["main"] -markers = "python_version < \"3.12\"" +markers = "python_version == \"3.11\"" files = [ {file = "zstd-1.5.7.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e17104d0e88367a7571dde4286e233126c8551691ceff11f9ae2e3a3ac1bb483"}, {file = "zstd-1.5.7.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:d6ee5dfada4c8fa32f43cc092fcf7d8482da6ad242c22fdf780f7eebd0febcc7"}, @@ -5440,5 +5392,5 @@ upnp = ["miniupnpc"] [metadata] lock-version = "2.1" -python-versions = ">=3.10, <4" -content-hash = "e11d038ee07d4f2a4224f66d6e4a2bd0533e6060ec0afaa8f279a0f1c6a9673d" +python-versions = ">=3.11, <4" +content-hash = "8c493a1dcbd284e725f15cc65fac965279ba7ad5368650b798c76611bc07b7e3" diff --git a/pyproject.toml b/pyproject.toml index cdcf3895ac..f8774a31dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "chia-blockchain" dynamic = [ "dependencies", "version" ] description = "Chia blockchain full node, farmer, timelord, and wallet." -requires-python = ">=3.10, <4" +requires-python = ">=3.11, <4" authors = [ {name="Mariano Sorgente", email="mariano@chia.net"} ] @@ -114,10 +114,6 @@ sortedcontainers-stubs = {version = ">= 2.4.3", optional = true } types-colorama = { version = ">=0.4.15.20260508", optional = true } lxml = { version = ">=6.1.0", optional = true } miniupnpc = {version = ">=2.3.2, <3", source = "chia", optional = true} -# big-o = {version = "0.11.0", optional = true} -# numpy = [ -# {version="<=1.24.4", python = "<3.10", optional = true}, -# {version=">=1.26.4", python = ">=3.10", optional = true}] ruff = { version = ">=0.16.7", optional = true } [project.optional-dependencies] diff --git a/ruff.toml b/ruff.toml index 19fe1ef2f7..96d649654b 100644 --- a/ruff.toml +++ b/ruff.toml @@ -43,6 +43,12 @@ ignore = [ # flake8-implicit-str-concat "ISC003", # explicit-string-concatenation + # pyupgrade + # `StrEnum` changes `str()` and `format()` output. The remaining `(str, Enum)` classes + # cross the daemon websocket protocol, RPC error payloads and benchmark CLI parsing. + # TODO: convert these to `enum.StrEnum` + "UP042", # replace-str-enum + # Ruff Specific # This code is problematic because using instantiated types as defaults is so common across the codebase.