From 7e5896f52bf400770738eba8f38c8e37e6a10538 Mon Sep 17 00:00:00 2001 From: miruka Date: Fri, 13 Mar 2020 02:46:21 -0400 Subject: [PATCH] Fix MediaCache asyncio Semaphore early import bug --- TODO.md | 1 - src/backend/pyotherside_events.py | 21 ++++++++++----------- src/backend/qml_bridge.py | 6 +++++- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/TODO.md b/TODO.md index ff0fcb45..fc92bc53 100644 --- a/TODO.md +++ b/TODO.md @@ -90,7 +90,6 @@ - Multiaccount aliases: - Warn when conflict with another alias - - Forbid spaces? - Add an explanation tooltip - Prevent sending messages with a user not in the current room - Support \ escaping diff --git a/src/backend/pyotherside_events.py b/src/backend/pyotherside_events.py index a54db7ba..e95ec625 100644 --- a/src/backend/pyotherside_events.py +++ b/src/backend/pyotherside_events.py @@ -1,15 +1,14 @@ # SPDX-License-Identifier: LGPL-3.0-or-later -from abc import ABC from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, Optional import pyotherside -from .models import SyncId from .utils import serialize_value_for_qml if TYPE_CHECKING: + from .models import SyncId from .models.model_item import ModelItem @@ -66,7 +65,7 @@ class LoopException(PyOtherSideEvent): class ModelItemInserted(PyOtherSideEvent): """Indicate a `ModelItem` insertion into a `Backend` `Model`.""" - sync_id: SyncId = field() + sync_id: "SyncId" = field() index: int = field() item: "ModelItem" = field() @@ -75,23 +74,23 @@ class ModelItemInserted(PyOtherSideEvent): class ModelItemFieldChanged(PyOtherSideEvent): """Indicate a `ModelItem`'s field value change in a `Backend` `Model`.""" - sync_id: SyncId = field() - item_index_then: int = field() - item_index_now: int = field() - changed_field: str = field() - field_value: Any = field() + sync_id: "SyncId" = field() + item_index_then: int = field() + item_index_now: int = field() + changed_field: str = field() + field_value: Any = field() @dataclass class ModelItemDeleted(PyOtherSideEvent): """Indicate the removal of a `ModelItem` from a `Backend` `Model`.""" - sync_id: SyncId = field() - index: int = field() + sync_id: "SyncId" = field() + index: int = field() @dataclass class ModelCleared(PyOtherSideEvent): """Indicate that a `Backend` `Model` was cleared.""" - sync_id: SyncId = field() + sync_id: "SyncId" = field() diff --git a/src/backend/qml_bridge.py b/src/backend/qml_bridge.py index 163c3ee4..f98e13f7 100644 --- a/src/backend/qml_bridge.py +++ b/src/backend/qml_bridge.py @@ -2,6 +2,10 @@ """Install `uvloop` if possible and provide a `QMLBridge`.""" +# WARNING: make sure to not top-level import the media_cache module here, +# directly or indirectly via another module import (e.g. backend). +# See https://stackoverflow.com/a/55918049 + import asyncio import logging as log import signal @@ -11,7 +15,6 @@ from operator import attrgetter from threading import Thread from typing import Coroutine, Sequence -from .backend import Backend from .pyotherside_events import CoroutineDone, LoopException try: @@ -36,6 +39,7 @@ class QMLBridge: """ def __init__(self) -> None: + from .backend import Backend self.backend: Backend = Backend() self._loop = asyncio.get_event_loop()