Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Core refactor cycle breaking #112

Merged
merged 10 commits into from
Oct 28, 2024
22 changes: 10 additions & 12 deletions src/lifeblood/basenode.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
import asyncio
from copy import deepcopy
from typing import Dict, Optional, Any
from logging import Logger
from .nodethings import ProcessingResult
from .uidata import NodeUi, ParameterNotFound, Parameter
from .node_ui import NodeUi
from .node_parameters import ParameterNotFound, Parameter
from .processingcontext import ProcessingContext
from .logging import get_logger
from .plugin_info import PluginInfo, empty_plugin_info
from .nodegraph_holder_base import NodeGraphHolderBase
from .node_ui_callback_receiver_base import NodeUiCallbackReceiverBase

# reexport
from .nodethings import ProcessingError
from typing import Iterable

from typing import TYPE_CHECKING, Iterable

if TYPE_CHECKING:
from logging import Logger


class BaseNode:
class BaseNode(NodeUiCallbackReceiverBase):
_plugin_data = None # To be set on module level by loader, set to empty_plugin_info by default

@classmethod
@@ -37,6 +34,7 @@ def description(cls) -> str:
return 'this node type does not have a description'

def __init__(self, name: str):
super().__init__()
if BaseNode._plugin_data is None:
BaseNode._plugin_data = empty_plugin_info
self.__parent: NodeGraphHolderBase = None
@@ -172,7 +170,7 @@ def _process_task_wrapper(self, task_dict, node_config) -> ProcessingResult:
# with self.get_ui().lock_interface_readonly(): # TODO: this is bad, RETHINK!
# TODO: , in case threads do l1---r1 - release2 WILL leave lock in locked state forever, as it remembered it at l2
# TODO: l2---r2
return self.process_task(ProcessingContext(self, task_dict, node_config))
return self.process_task(ProcessingContext(self.name(), self.label(), self.get_ui(), task_dict, node_config))

def process_task(self, context: ProcessingContext) -> ProcessingResult:
"""
@@ -185,7 +183,7 @@ def process_task(self, context: ProcessingContext) -> ProcessingResult:

def _postprocess_task_wrapper(self, task_dict, node_config) -> ProcessingResult:
# with self.get_ui().lock_interface_readonly(): #TODO: read comment for _process_task_wrapper
return self.postprocess_task(ProcessingContext(self, task_dict, node_config))
return self.postprocess_task(ProcessingContext(self.name(), self.label(), self.get_ui(), task_dict, node_config))

def postprocess_task(self, context: ProcessingContext) -> ProcessingResult:
"""
@@ -199,7 +197,7 @@ def postprocess_task(self, context: ProcessingContext) -> ProcessingResult:
def copy_ui_to(self, to_node: "BaseNode"):
newui = deepcopy(self._parameters) # nodeUI redefines deepcopy to detach new copy from node
to_node._parameters = newui
newui.attach_to_node(to_node)
newui.set_ui_change_callback_receiver(to_node)

def apply_settings(self, settings: Dict[str, Dict[str, Any]]) -> None:
with self.get_ui().postpone_ui_callbacks():
2 changes: 1 addition & 1 deletion src/lifeblood/basenode_serializer_v2.py
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
from .basenode_serialization import NodeSerializerBase, IncompatibleDeserializationMethod, FailedToApplyNodeState, FailedToApplyParameters
from .basenode import BaseNode
from .enums import NodeParameterType
from .uidata import ParameterFullValue
from .node_parameters import ParameterFullValue

from typing import Optional, Tuple, Union

@@ -85,7 +85,7 @@
state = node.get_state()
return None if state is None else json.dumps(state, cls=NodeSerializerV2.Serializer).encode('latin1')

def deserialize(self, node_data_provider: NodeDataProvider, data: bytes, state: Optional[bytes]) -> BaseNode:

Check warning on line 88 in src/lifeblood/basenode_serializer_v2.py

GitHub Actions / flake8

C901 'NodeSerializerV2.deserialize' is too complex (11)
try:
data_dict = json.loads(data.decode('latin1'), cls=NodeSerializerV2.Deserializer)
except json.JSONDecodeError:
5 changes: 1 addition & 4 deletions src/lifeblood/broadcasting.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import asyncio
import socket
from string import ascii_letters
import random
import struct

from . import logging
from .nethelpers import get_localhost
from .defaults import broadcast_port as default_broadcast_port

from . import os_based_cheats
from . import os_based_cheats # import needed for windows

Check warning on line 8 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

F401 '.os_based_cheats' imported but unused

from typing import Tuple, Union, Optional, Callable, Coroutine, Any

@@ -76,11 +73,11 @@
# TODO: raise on dgram size too big

def connection_made(self, transport: asyncio.transports.DatagramTransport):
self.__logger.info(f'started broadcasting')

Check warning on line 76 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

F541 f-string is missing placeholders
self.__transport = transport
sock = transport.get_extra_info("socket") # type: socket.socket

Check warning on line 78 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

F841 local variable 'sock' is assigned to but never used
#sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Check warning on line 79 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

E265 block comment should start with '# '
#sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

Check warning on line 80 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

E265 block comment should start with '# '
self.__broadcast_task = self.__loop.create_task(self.broadcast())

def datagram_received(self, data: Union[bytes, str], addr: Address):
@@ -121,8 +118,8 @@
self.__transport = transport
sock = transport.get_extra_info("socket") # type: socket.socket
self.__logger.info(f'started listening on {sock.getsockname()}')
#sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Check warning on line 121 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

E265 block comment should start with '# '
#sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)

Check warning on line 122 in src/lifeblood/broadcasting.py

GitHub Actions / flake8

E265 block comment should start with '# '
#sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

def datagram_received(self, data: Union[bytes, str], addr: Address):
2 changes: 0 additions & 2 deletions src/lifeblood/core_nodes/environment_resolver_setter.py
Original file line number Diff line number Diff line change
@@ -3,8 +3,6 @@
from lifeblood.processingcontext import ProcessingContext
from lifeblood.enums import NodeParameterType
from lifeblood.environment_resolver import EnvironmentResolverArguments
from lifeblood.uidata import NodeUi, MultiGroupLayout, Parameter
from lifeblood.node_visualization_classes import NodeColorScheme

from typing import Iterable

4 changes: 0 additions & 4 deletions src/lifeblood/core_nodes/mod_attrib.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult
from lifeblood.taskspawn import TaskSpawn
from lifeblood.exceptions import NodeNotReadyToProcess
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi, MultiGroupLayout, Parameter
from lifeblood.node_visualization_classes import NodeColorScheme

from typing import Iterable

11 changes: 2 additions & 9 deletions src/lifeblood/core_nodes/parent_children_waiter.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import dataclasses
from dataclasses import dataclass
from lifeblood.attribute_serialization import deserialize_attributes_core
from lifeblood.node_plugin_base import BaseNode, ProcessingError
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult
from lifeblood.taskspawn import TaskSpawn
from lifeblood.exceptions import NodeNotReadyToProcess
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi
from lifeblood.processingcontext import ProcessingContext

from threading import Lock

from typing import Any, Dict, Iterable, List, Optional, Set, TypedDict , TYPE_CHECKING

if TYPE_CHECKING:
from lifeblood.scheduler import Scheduler
from typing import Dict, Iterable, List, Set


def node_class():
11 changes: 4 additions & 7 deletions src/lifeblood/core_nodes/python.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
import re
import time

from lifeblood.node_plugin_base import BaseNodeWithTaskRequirements
from lifeblood.invocationjob import InvocationJob, InvocationEnvironment
from lifeblood.invocationjob import InvocationJob
from lifeblood.processingcontext import ProcessingContext
from lifeblood.nodethings import ProcessingResult, ProcessingError
from lifeblood.uidata import NodeParameterType
from lifeblood.enums import NodeParameterType

from typing import Iterable

from types import MappingProxyType
from typing import TYPE_CHECKING, Iterable
if TYPE_CHECKING:
from lifeblood.scheduler import Scheduler


def node_class():
3 changes: 0 additions & 3 deletions src/lifeblood/core_nodes/rename_attrib.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult, ProcessingError
from lifeblood.taskspawn import TaskSpawn
from lifeblood.exceptions import NodeNotReadyToProcess
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi

from typing import Iterable

8 changes: 1 addition & 7 deletions src/lifeblood/core_nodes/split_waiter.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
from dataclasses import dataclass
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult
from lifeblood.taskspawn import TaskSpawn
from lifeblood.exceptions import NodeNotReadyToProcess
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi
from lifeblood.processingcontext import ProcessingContext

from threading import Lock

from typing import Dict, TypedDict, Set, Iterable, Optional, Any, TYPE_CHECKING

if TYPE_CHECKING:
from lifeblood.scheduler import Scheduler
from typing import Dict, Set, Iterable, Optional


@dataclass
4 changes: 1 addition & 3 deletions src/lifeblood/core_nodes/switch.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult, ProcessingError
from lifeblood.nodethings import ProcessingResult
from lifeblood.processingcontext import ProcessingContext
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi, Parameter, VerticalParametersLayout, ParameterHierarchyItem, ParametersLayoutBase
from lifeblood.node_visualization_classes import NodeColorScheme

from typing import Iterable

6 changes: 2 additions & 4 deletions src/lifeblood/core_nodes/test.py
Original file line number Diff line number Diff line change
@@ -3,11 +3,9 @@
from lifeblood.node_plugin_base import BaseNode
from lifeblood.invocationjob import InvocationJob, InvocationEnvironment
from lifeblood.nodethings import ProcessingResult
from lifeblood.uidata import NodeParameterType
from lifeblood.enums import NodeParameterType

from typing import TYPE_CHECKING, Iterable
if TYPE_CHECKING:
from lifeblood.scheduler import Scheduler
from typing import Iterable


def node_class():
3 changes: 0 additions & 3 deletions src/lifeblood/core_nodes/wait_for_task.py
Original file line number Diff line number Diff line change
@@ -2,11 +2,8 @@
import shlex
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult, ProcessingContext
from lifeblood.taskspawn import TaskSpawn
from lifeblood.exceptions import NodeNotReadyToProcess
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi, MultiGroupLayout, Parameter
from lifeblood.node_visualization_classes import NodeColorScheme

from typing import Dict, Iterable, List, Optional, Set

1 change: 0 additions & 1 deletion src/lifeblood/core_nodes/wedge.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from lifeblood.node_plugin_base import BaseNode
from lifeblood.nodethings import ProcessingResult, ProcessingError
from lifeblood.enums import NodeParameterType
from lifeblood.uidata import NodeUi, MultiGroupLayout, Parameter

from typing import Iterable

6 changes: 6 additions & 0 deletions src/lifeblood/expression_locals_provider_base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from typing import Any, Dict


class ExpressionLocalsProviderBase:
def locals(self) -> Dict[str, Any]:
raise NotImplementedError()
6 changes: 2 additions & 4 deletions src/lifeblood/hardware_resources.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import psutil
import copy
import re
import json
from .misc import get_unique_machine_id
@@ -128,11 +126,11 @@ def __repr__(self):
parts = []
for res_name, res in self.__resources.items():
parts.append(f'{res_name}: {res.value}')
for dev_type, dev_res in self.__dev_resources.items():
for dev_type, dev_name, dev_res in self.__dev_resources:
dev_parts = []
for res_name, res in dev_res.items():
dev_parts.append(f'{res_name}: {res.value}')
parts.append(f'device({dev_type})[{", ".join(dev_parts)}]')
parts.append(f'device(type:"{dev_type}" name:"{dev_name}")[{", ".join(dev_parts)}]')

return f'<hwid={self.hwid}, {", ".join(parts)}>'

3 changes: 1 addition & 2 deletions src/lifeblood/local_notifier.py
Original file line number Diff line number Diff line change
@@ -2,10 +2,9 @@
import json
import uuid
from . import broadcasting
from . import logging
from .nethelpers import get_localhost

from typing import Optional, Tuple, Callable, Coroutine, Any
from typing import Optional, Tuple, Callable, Coroutine
from .logging import get_logger


4 changes: 2 additions & 2 deletions src/lifeblood/main_scheduler.py
Original file line number Diff line number Diff line change
@@ -5,14 +5,14 @@
import signal
from .config import get_config, create_default_user_config_file
from .pluginloader import PluginNodeDataProvider
from .scheduler import Scheduler
from .scheduler.scheduler import Scheduler
from .basenode_serializer_v1 import NodeSerializerV1
from .basenode_serializer_v2 import NodeSerializerV2
from .scheduler_config_provider_base import SchedulerConfigProviderBase
from .scheduler_config_provider_file import SchedulerConfigProviderFileOverrides
from . import logging

from typing import Iterable, List, Optional, Tuple, Union
from typing import Iterable, List, Tuple, Union


def __construct_plugin_paths(custom_plugins_path: Union[None, str, Path], plugin_search_locations: Iterable[Union[str, Path]]) -> List[Tuple[Path, str]]:
4 changes: 2 additions & 2 deletions src/lifeblood/main_workerpool.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sys
import argparse

from . import simple_worker_pool
from . import simple_worker_pool_main


def main(argv):
@@ -14,7 +14,7 @@ def main(argv):
opts = parser.parse_args(argv[:1])
remaining_args = argv[1:]

known_types = {'simple': simple_worker_pool}
known_types = {'simple': simple_worker_pool_main}
if opts.list:
print('known pool types:\n' + '\n'.join(f'\t{x}' for x in known_types))
return
3 changes: 1 addition & 2 deletions src/lifeblood/misc.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import os
import asyncio
import random
import uuid
import time
import psutil
from time import perf_counter
from contextlib import contextmanager, asynccontextmanager
from .logging import get_logger, logging

from typing import List, Optional, Union
from typing import Union


class DummyLock:
2 changes: 0 additions & 2 deletions src/lifeblood/names.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import re

from lifeblood.logging import get_logger
from typing import Iterable

5 changes: 1 addition & 4 deletions src/lifeblood/net_messages/impl/message_protocol.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import asyncio
import uuid
import struct

from ..logging import get_logger
from ..stream_wrappers import MessageReceiveStream
from ..messages import Message
from ..queue import MessageQueue
from ..address import DirectAddress
from ..exceptions import MessageReceivingError, NoMessageError, MessageTransferError, MessageTransferTimeoutError
from ..interfaces import MessageStreamFactory
from ..exceptions import NoMessageError, MessageTransferError, MessageTransferTimeoutError

from typing import Callable, Awaitable, Tuple

1 change: 0 additions & 1 deletion src/lifeblood/net_messages/impl/tcp_message_processor.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import asyncio
from ..message_processor import MessageProcessorBase
from ..message_handler import MessageHandlerBase
from ..messages import Message
2 changes: 1 addition & 1 deletion src/lifeblood/net_messages/impl/tcp_message_receiver.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import asyncio
from .message_protocol import MessageProtocol, IProtocolInstanceCounter
from ..interfaces import MessageReceiver, MessageStreamFactory
from ..interfaces import MessageReceiver
from ..messages import Message
from ..address import DirectAddress
from ..logging import get_logger
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
from ..exceptions import MessageTransferError, MessageTransferTimeoutError
from ..interfaces import MessageStreamFactory
from ..stream_wrappers import MessageSendStream, MessageSendStreamBase
from ..address import DirectAddress, AddressChain
from ..address import DirectAddress
from ..defaults import default_stream_timeout
from ..messages import Message

Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
from .clients import JsonMessageClientFactory, CommandJsonMessageClientFactory
from ..address import DirectAddress
from ..message_handler import MessageHandlerBase
from .tcp_message_processor import TcpMessageProcessor

from typing import Iterable, Optional, Sequence, Tuple, Union


class TcpJsonMessageProcessor(TcpMessageProcessor):
def __init__(self, listening_address_or_addresses: Union[Tuple[str, int], Iterable[Tuple[str, int]]], *,
def __init__(self, listening_address_or_addresses: Union[Tuple[str, int], Iterable[Tuple[str, int]], DirectAddress, Iterable[DirectAddress]], *,
backlog=4096,
connection_pool_cache_time=300,
message_client_factory: Optional[JsonMessageClientFactory] = None,
@@ -19,7 +20,7 @@ def __init__(self, listening_address_or_addresses: Union[Tuple[str, int], Iterab


class TcpCommandMessageProcessor(TcpJsonMessageProcessor):
def __init__(self, listening_address_or_addresses: Union[Tuple[str, int], Iterable[Tuple[str, int]]], *,
def __init__(self, listening_address_or_addresses: Union[Tuple[str, int], Iterable[Tuple[str, int]], DirectAddress, Iterable[DirectAddress]], *,
backlog=4096,
connection_pool_cache_time=300,
message_handlers: Sequence[MessageHandlerBase] = ()):
4 changes: 2 additions & 2 deletions src/lifeblood/net_messages/interfaces.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from .messages import Message
from .message_stream import MessageSendStreamBase, MessageReceiveStreamBase
from .address import DirectAddress, AddressChain
from .message_stream import MessageSendStreamBase
from .address import DirectAddress

from typing import Callable, Awaitable

Loading
Oops, something went wrong.
Loading
Oops, something went wrong.