mirror of
https://github.com/varun-r-mallya/py-libp2p.git
synced 2025-12-31 20:36:24 +00:00
ft. modernise py-libp2p (#618)
* fix pyproject.toml , add ruff * rm lock * make progress * add poetry lock ignore * fix type issues * fix tcp type errors * fix text example - type error - wrong args * add setuptools to dev * test ci * fix docs build * fix type issues for new_swarm & new_host * fix types in gossipsub * fix type issues in noise * wip: factories * revert factories * fix more type issues * more type fixes * fix: add null checks for noise protocol initialization and key handling * corrected argument-errors in peerId and Multiaddr in peer tests * fix: Noice - remove redundant type casts in BaseNoiseMsgReadWriter * fix: update test_notify.py to use SwarmFactory.create_batch_and_listen, fix type hints, and comment out ClosedStream assertions * Fix type checks for pubsub module Signed-off-by: sukhman <sukhmansinghsaluja@gmail.com> * Fix type checks for pubsub module-tests Signed-off-by: sukhman <sukhmansinghsaluja@gmail.com> * noise: add checks for uninitialized protocol and key states in PatternXX Signed-off-by: varun-r-mallya <varunrmallya@gmail.com> * pubsub: add None checks for optional fields in FloodSub and Pubsub Signed-off-by: varun-r-mallya <varunrmallya@gmail.com> * Fix type hints and improve testing Signed-off-by: varun-r-mallya <varunrmallya@gmail.com> * remove redundant checks Signed-off-by: varun-r-mallya <varunrmallya@gmail.com> * fix build issues * add optional to trio service * fix types * fix type errors * Fix type errors Signed-off-by: varun-r-mallya <varunrmallya@gmail.com> * fixed more-type checks in crypto and peer_data files * wip: factories * replaced union with optional * fix: type-error in interp-utils and peerinfo * replace pyright with pyrefly * add pyrefly.toml * wip: fix multiselect issues * try typecheck * base check * mcache test fixes , typecheck ci update * fix ci * will this work * minor fix * use poetry * fix wokflow * use cache,fix err * fix pyrefly.toml * fix pyrefly.toml * fix cache in ci * deploy commit * add main baseline * update to v5 * improve typecheck ci (#14) * fix typo * remove holepunching code (#16) * fix gossipsub typeerrors (#17) * fix: ensure initiator user includes remote peer id in handshake (#15) * fix ci (#19) * typefix: custom_types | core/peerinfo/test_peer_info | io/abc | pubsub/floodsub | protocol_muxer/multiselect (#18) * fix: Typefixes in PeerInfo (#21) * fix minor type issue (#22) * fix type errors in pubsub (#24) * fix: Minor typefixes in tests (#23) * Fix failing tests for type-fixed test/pubsub (#8) * move pyrefly & ruff to pyproject.toml & rm .project-template (#28) * move the async_context file to tests/core * move crypto test to crypto folder * fix: some typefixes (#25) * fix type errors * fix type issues * fix: update gRPC API usage in autonat_pb2_grpc.py (#31) * md: typecheck ci * rm comments * clean up : from review suggestions * use | None over Optional as per new python standards * drop supporto for py3.9 * newsfragments --------- Signed-off-by: sukhman <sukhmansinghsaluja@gmail.com> Signed-off-by: varun-r-mallya <varunrmallya@gmail.com> Co-authored-by: acul71 <luca.pisani@birdo.net> Co-authored-by: kaneki003 <sakshamchauhan707@gmail.com> Co-authored-by: sukhman <sukhmansinghsaluja@gmail.com> Co-authored-by: varun-r-mallya <varunrmallya@gmail.com> Co-authored-by: varunrmallya <100590632+varun-r-mallya@users.noreply.github.com> Co-authored-by: lla-dane <abhinavagarwalla6@gmail.com> Co-authored-by: Collins <ArtemisfowlX@protonmail.com> Co-authored-by: Abhinav Agarwalla <120122716+lla-dane@users.noreply.github.com> Co-authored-by: guha-rahul <52607971+guha-rahul@users.noreply.github.com> Co-authored-by: Sukhman Singh <63765293+sukhman-sukh@users.noreply.github.com> Co-authored-by: acul71 <34693171+acul71@users.noreply.github.com> Co-authored-by: pacrob <5199899+pacrob@users.noreply.github.com>
This commit is contained in:
@ -1,12 +1,10 @@
|
||||
# Copied from https://github.com/ethereum/async-service
|
||||
|
||||
import os
|
||||
from typing import (
|
||||
Any,
|
||||
)
|
||||
from typing import Any
|
||||
|
||||
|
||||
def get_task_name(value: Any, explicit_name: str = None) -> str:
|
||||
def get_task_name(value: Any, explicit_name: str | None = None) -> str:
|
||||
# inline import to ensure `_utils` is always importable from the rest of
|
||||
# the module.
|
||||
from .abc import ( # noqa: F401
|
||||
|
||||
@ -28,33 +28,27 @@ class TaskAPI(Hashable):
|
||||
parent: Optional["TaskWithChildrenAPI"]
|
||||
|
||||
@abstractmethod
|
||||
async def run(self) -> None:
|
||||
...
|
||||
async def run(self) -> None: ...
|
||||
|
||||
@abstractmethod
|
||||
async def cancel(self) -> None:
|
||||
...
|
||||
async def cancel(self) -> None: ...
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def is_done(self) -> bool:
|
||||
...
|
||||
def is_done(self) -> bool: ...
|
||||
|
||||
@abstractmethod
|
||||
async def wait_done(self) -> None:
|
||||
...
|
||||
async def wait_done(self) -> None: ...
|
||||
|
||||
|
||||
class TaskWithChildrenAPI(TaskAPI):
|
||||
children: set[TaskAPI]
|
||||
|
||||
@abstractmethod
|
||||
def add_child(self, child: TaskAPI) -> None:
|
||||
...
|
||||
def add_child(self, child: TaskAPI) -> None: ...
|
||||
|
||||
@abstractmethod
|
||||
def discard_child(self, child: TaskAPI) -> None:
|
||||
...
|
||||
def discard_child(self, child: TaskAPI) -> None: ...
|
||||
|
||||
|
||||
class ServiceAPI(ABC):
|
||||
@ -212,7 +206,11 @@ class InternalManagerAPI(ManagerAPI):
|
||||
@trio_typing.takes_callable_and_args
|
||||
@abstractmethod
|
||||
def run_task(
|
||||
self, async_fn: AsyncFn, *args: Any, daemon: bool = False, name: str = None
|
||||
self,
|
||||
async_fn: AsyncFn,
|
||||
*args: Any,
|
||||
daemon: bool = False,
|
||||
name: str | None = None,
|
||||
) -> None:
|
||||
"""
|
||||
Run a task in the background. If the function throws an exception it
|
||||
@ -225,7 +223,9 @@ class InternalManagerAPI(ManagerAPI):
|
||||
|
||||
@trio_typing.takes_callable_and_args
|
||||
@abstractmethod
|
||||
def run_daemon_task(self, async_fn: AsyncFn, *args: Any, name: str = None) -> None:
|
||||
def run_daemon_task(
|
||||
self, async_fn: AsyncFn, *args: Any, name: str | None = None
|
||||
) -> None:
|
||||
"""
|
||||
Run a daemon task in the background.
|
||||
|
||||
@ -235,7 +235,7 @@ class InternalManagerAPI(ManagerAPI):
|
||||
|
||||
@abstractmethod
|
||||
def run_child_service(
|
||||
self, service: ServiceAPI, daemon: bool = False, name: str = None
|
||||
self, service: ServiceAPI, daemon: bool = False, name: str | None = None
|
||||
) -> "ManagerAPI":
|
||||
"""
|
||||
Run a service in the background. If the function throws an exception it
|
||||
@ -248,7 +248,7 @@ class InternalManagerAPI(ManagerAPI):
|
||||
|
||||
@abstractmethod
|
||||
def run_daemon_child_service(
|
||||
self, service: ServiceAPI, name: str = None
|
||||
self, service: ServiceAPI, name: str | None = None
|
||||
) -> "ManagerAPI":
|
||||
"""
|
||||
Run a daemon service in the background.
|
||||
|
||||
@ -9,6 +9,7 @@ from collections import (
|
||||
)
|
||||
from collections.abc import (
|
||||
Awaitable,
|
||||
Callable,
|
||||
Iterable,
|
||||
Sequence,
|
||||
)
|
||||
@ -16,8 +17,6 @@ import logging
|
||||
import sys
|
||||
from typing import (
|
||||
Any,
|
||||
Callable,
|
||||
Optional,
|
||||
TypeVar,
|
||||
cast,
|
||||
)
|
||||
@ -98,7 +97,7 @@ def as_service(service_fn: LogicFnType) -> type[ServiceAPI]:
|
||||
|
||||
class BaseTask(TaskAPI):
|
||||
def __init__(
|
||||
self, name: str, daemon: bool, parent: Optional[TaskWithChildrenAPI]
|
||||
self, name: str, daemon: bool, parent: TaskWithChildrenAPI | None
|
||||
) -> None:
|
||||
# meta
|
||||
self.name = name
|
||||
@ -125,7 +124,7 @@ class BaseTask(TaskAPI):
|
||||
|
||||
class BaseTaskWithChildren(BaseTask, TaskWithChildrenAPI):
|
||||
def __init__(
|
||||
self, name: str, daemon: bool, parent: Optional[TaskWithChildrenAPI]
|
||||
self, name: str, daemon: bool, parent: TaskWithChildrenAPI | None
|
||||
) -> None:
|
||||
super().__init__(name, daemon, parent)
|
||||
self.children = set()
|
||||
@ -142,26 +141,20 @@ T = TypeVar("T", bound="BaseFunctionTask")
|
||||
|
||||
class BaseFunctionTask(BaseTaskWithChildren):
|
||||
@classmethod
|
||||
def iterate_tasks(cls: type[T], *tasks: TaskAPI) -> Iterable[T]:
|
||||
def iterate_tasks(cls, *tasks: TaskAPI) -> Iterable["BaseFunctionTask"]:
|
||||
"""Iterate over all tasks of this class type and their children recursively."""
|
||||
for task in tasks:
|
||||
if isinstance(task, cls):
|
||||
if isinstance(task, BaseFunctionTask):
|
||||
yield task
|
||||
else:
|
||||
continue
|
||||
|
||||
yield from cls.iterate_tasks(
|
||||
*(
|
||||
child_task
|
||||
for child_task in task.children
|
||||
if isinstance(child_task, cls)
|
||||
)
|
||||
)
|
||||
if isinstance(task, TaskWithChildrenAPI):
|
||||
yield from cls.iterate_tasks(*task.children)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
daemon: bool,
|
||||
parent: Optional[TaskWithChildrenAPI],
|
||||
parent: TaskWithChildrenAPI | None,
|
||||
async_fn: AsyncFn,
|
||||
async_fn_args: Sequence[Any],
|
||||
) -> None:
|
||||
@ -259,12 +252,15 @@ class BaseManager(InternalManagerAPI):
|
||||
# Wait API
|
||||
#
|
||||
def run_daemon_task(
|
||||
self, async_fn: Callable[..., Awaitable[Any]], *args: Any, name: str = None
|
||||
self,
|
||||
async_fn: Callable[..., Awaitable[Any]],
|
||||
*args: Any,
|
||||
name: str | None = None,
|
||||
) -> None:
|
||||
self.run_task(async_fn, *args, daemon=True, name=name)
|
||||
|
||||
def run_daemon_child_service(
|
||||
self, service: ServiceAPI, name: str = None
|
||||
self, service: ServiceAPI, name: str | None = None
|
||||
) -> ManagerAPI:
|
||||
return self.run_child_service(service, daemon=True, name=name)
|
||||
|
||||
@ -286,8 +282,7 @@ class BaseManager(InternalManagerAPI):
|
||||
# Task Management
|
||||
#
|
||||
@abstractmethod
|
||||
def _schedule_task(self, task: TaskAPI) -> None:
|
||||
...
|
||||
def _schedule_task(self, task: TaskAPI) -> None: ...
|
||||
|
||||
def _common_run_task(self, task: TaskAPI) -> None:
|
||||
if not self.is_running:
|
||||
@ -307,7 +302,7 @@ class BaseManager(InternalManagerAPI):
|
||||
self._schedule_task(task)
|
||||
|
||||
def _add_child_task(
|
||||
self, parent: Optional[TaskWithChildrenAPI], task: TaskAPI
|
||||
self, parent: TaskWithChildrenAPI | None, task: TaskAPI
|
||||
) -> None:
|
||||
if parent is None:
|
||||
all_children = self._root_tasks
|
||||
|
||||
@ -6,7 +6,9 @@ from __future__ import (
|
||||
from collections.abc import (
|
||||
AsyncIterator,
|
||||
Awaitable,
|
||||
Callable,
|
||||
Coroutine,
|
||||
Iterable,
|
||||
Sequence,
|
||||
)
|
||||
from contextlib import (
|
||||
@ -16,7 +18,6 @@ import functools
|
||||
import sys
|
||||
from typing import (
|
||||
Any,
|
||||
Callable,
|
||||
Optional,
|
||||
TypeVar,
|
||||
cast,
|
||||
@ -59,6 +60,16 @@ from .typing import (
|
||||
class FunctionTask(BaseFunctionTask):
|
||||
_trio_task: trio.lowlevel.Task | None = None
|
||||
|
||||
@classmethod
|
||||
def iterate_tasks(cls, *tasks: TaskAPI) -> Iterable[FunctionTask]:
|
||||
"""Iterate over all FunctionTask instances and their children recursively."""
|
||||
for task in tasks:
|
||||
if isinstance(task, FunctionTask):
|
||||
yield task
|
||||
|
||||
if isinstance(task, TaskWithChildrenAPI):
|
||||
yield from cls.iterate_tasks(*task.children)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
@ -75,7 +86,7 @@ class FunctionTask(BaseFunctionTask):
|
||||
|
||||
# Each task gets its own `CancelScope` which is how we can manually
|
||||
# control cancellation order of the task DAG
|
||||
self._cancel_scope = trio.CancelScope()
|
||||
self._cancel_scope = trio.CancelScope() # type: ignore[call-arg]
|
||||
|
||||
#
|
||||
# Trio specific API
|
||||
@ -309,7 +320,7 @@ class TrioManager(BaseManager):
|
||||
async_fn: Callable[..., Awaitable[Any]],
|
||||
*args: Any,
|
||||
daemon: bool = False,
|
||||
name: str = None,
|
||||
name: str | None = None,
|
||||
) -> None:
|
||||
task = FunctionTask(
|
||||
name=get_task_name(async_fn, name),
|
||||
@ -322,7 +333,7 @@ class TrioManager(BaseManager):
|
||||
self._common_run_task(task)
|
||||
|
||||
def run_child_service(
|
||||
self, service: ServiceAPI, daemon: bool = False, name: str = None
|
||||
self, service: ServiceAPI, daemon: bool = False, name: str | None = None
|
||||
) -> ManagerAPI:
|
||||
task = ChildServiceTask(
|
||||
name=get_task_name(service, name),
|
||||
@ -416,7 +427,12 @@ def external_api(func: TFunc) -> TFunc:
|
||||
async with trio.open_nursery() as nursery:
|
||||
# mypy's type hints for start_soon break with this invocation.
|
||||
nursery.start_soon(
|
||||
_wait_api_fn, self, func, args, kwargs, send_channel # type: ignore
|
||||
_wait_api_fn, # type: ignore
|
||||
self,
|
||||
func,
|
||||
args,
|
||||
kwargs,
|
||||
send_channel,
|
||||
)
|
||||
nursery.start_soon(_wait_finished, self, func, send_channel)
|
||||
result, err = await receive_channel.receive()
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
from collections.abc import (
|
||||
Awaitable,
|
||||
Callable,
|
||||
)
|
||||
from types import (
|
||||
TracebackType,
|
||||
)
|
||||
from typing import (
|
||||
Any,
|
||||
Callable,
|
||||
)
|
||||
|
||||
EXC_INFO = tuple[type[BaseException], BaseException, TracebackType]
|
||||
|
||||
@ -32,7 +32,7 @@ class GossipsubParams(NamedTuple):
|
||||
degree: int = 10
|
||||
degree_low: int = 9
|
||||
degree_high: int = 11
|
||||
direct_peers: Sequence[PeerInfo] = None
|
||||
direct_peers: Sequence[PeerInfo] = []
|
||||
time_to_live: int = 30
|
||||
gossip_window: int = 3
|
||||
gossip_history: int = 5
|
||||
|
||||
@ -1,10 +1,8 @@
|
||||
from collections.abc import (
|
||||
Awaitable,
|
||||
)
|
||||
import logging
|
||||
from typing import (
|
||||
Callable,
|
||||
)
|
||||
import logging
|
||||
|
||||
import trio
|
||||
|
||||
@ -63,12 +61,12 @@ async def connect_swarm(swarm_0: Swarm, swarm_1: Swarm) -> None:
|
||||
|
||||
logging.debug(
|
||||
"Swarm connection verification failed on attempt"
|
||||
+ f" {attempt+1}, retrying..."
|
||||
+ f" {attempt + 1}, retrying..."
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
last_error = e
|
||||
logging.debug(f"Swarm connection attempt {attempt+1} failed: {e}")
|
||||
logging.debug(f"Swarm connection attempt {attempt + 1} failed: {e}")
|
||||
await trio.sleep(retry_delay)
|
||||
|
||||
# If we got here, all retries failed
|
||||
@ -115,12 +113,12 @@ async def connect(node1: IHost, node2: IHost) -> None:
|
||||
return
|
||||
|
||||
logging.debug(
|
||||
f"Connection verification failed on attempt {attempt+1}, retrying..."
|
||||
f"Connection verification failed on attempt {attempt + 1}, retrying..."
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
last_error = e
|
||||
logging.debug(f"Connection attempt {attempt+1} failed: {e}")
|
||||
logging.debug(f"Connection attempt {attempt + 1} failed: {e}")
|
||||
await trio.sleep(retry_delay)
|
||||
|
||||
# If we got here, all retries failed
|
||||
|
||||
Reference in New Issue
Block a user