add Protocol metaclass and protocol.protocols global for storing subclasses

pull/517/head
Ryan Barrett 2023-05-23 15:15:28 -07:00
rodzic 6333b7126a
commit 892047a10c
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
2 zmienionych plików z 19 dodań i 1 usunięć

Wyświetl plik

@ -45,7 +45,19 @@ objects_cache_lock = threading.Lock()
logger = logging.getLogger(__name__)
class Protocol:
# maps string label to Protocol subclass. populated by ProtocolMeta.
protocols = {}
class ProtocolMeta(type):
""":class:`Protocol` metaclass. Registers all subclasses in the protocols global."""
def __new__(meta, name, bases, class_dict):
cls = super().__new__(meta, name, bases, class_dict)
if cls.LABEL:
protocols[cls.LABEL] = cls
return cls
class Protocol(metaclass=ProtocolMeta):
"""Base protocol class. Not to be instantiated; classmethods only.
Attributes:

Wyświetl plik

@ -5,9 +5,11 @@ from flask import g
from oauth_dropins.webutil.testutil import requests_response
import requests
import protocol
from protocol import Protocol
from flask_app import app
from models import Follower, Object, User
from webmention import Webmention
from .test_activitypub import ACTOR, REPLY
from . import testutil
@ -35,6 +37,10 @@ class ProtocolTest(testutil.TestCase):
self.request_context.pop()
super().tearDown()
def test_protocols_global(self):
self.assertEqual(FakeProtocol, protocol.protocols['fake'])
self.assertEqual(Webmention, protocol.protocols['webmention'])
@patch('requests.get')
def test_receive_reply_not_feed_not_notification(self, mock_get):
Follower.get_or_create(ACTOR['id'], 'foo.com')