Some documentation
This commit is contained in:
parent
c8c5fefabc
commit
49a9fccbf3
4 changed files with 70 additions and 24 deletions
|
@ -11,29 +11,13 @@ from butterrobot.queue import q
|
||||||
from butterrobot.db import ChannelQuery
|
from butterrobot.db import ChannelQuery
|
||||||
from butterrobot.config import SECRET_KEY, HOSTNAME
|
from butterrobot.config import SECRET_KEY, HOSTNAME
|
||||||
from butterrobot.objects import Message, Channel
|
from butterrobot.objects import Message, Channel
|
||||||
|
from butterrobot.http import ExternalProxyFix
|
||||||
from butterrobot.plugins import get_available_plugins
|
from butterrobot.plugins import get_available_plugins
|
||||||
from butterrobot.platforms import PLATFORMS, get_available_platforms
|
from butterrobot.platforms import PLATFORMS, get_available_platforms
|
||||||
from butterrobot.platforms.base import Platform
|
from butterrobot.platforms.base import Platform
|
||||||
from butterrobot.admin.blueprint import admin as admin_bp
|
from butterrobot.admin.blueprint import admin as admin_bp
|
||||||
|
|
||||||
|
|
||||||
class ExternalProxyFix(object):
|
|
||||||
"""
|
|
||||||
Custom proxy helper to get the external hostname from the `X-External-Host` header
|
|
||||||
used by one of the reverse proxies in front of this in production.
|
|
||||||
It does nothing if the header is not present.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, app):
|
|
||||||
self.app = app
|
|
||||||
|
|
||||||
def __call__(self, environ, start_response):
|
|
||||||
host = environ.get("HTTP_X_EXTERNAL_HOST", "")
|
|
||||||
if host:
|
|
||||||
environ["HTTP_HOST"] = host
|
|
||||||
return self.app(environ, start_response)
|
|
||||||
|
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
15
butterrobot/http.py
Normal file
15
butterrobot/http.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
class ExternalProxyFix(object):
|
||||||
|
"""
|
||||||
|
Custom proxy helper to get the external hostname from the `X-External-Host` header
|
||||||
|
used by one of the reverse proxies in front of this in production.
|
||||||
|
It does nothing if the header is not present.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, app):
|
||||||
|
self.app = app
|
||||||
|
|
||||||
|
def __call__(self, environ, start_response):
|
||||||
|
host = environ.get("HTTP_X_EXTERNAL_HOST", "")
|
||||||
|
if host:
|
||||||
|
environ["HTTP_HOST"] = host
|
||||||
|
return self.app(environ, start_response)
|
|
@ -1,4 +1,4 @@
|
||||||
from abc import abstractclassmethod
|
from abc import abstractmethod
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,14 +23,45 @@ class Platform:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def init(cls, app):
|
def init(cls, app):
|
||||||
|
"""
|
||||||
|
Initialises the platform.
|
||||||
|
|
||||||
|
Used at the application launch to prepare anything required for
|
||||||
|
the platform to work..
|
||||||
|
|
||||||
|
It receives the flask application via parameter in case the platform
|
||||||
|
requires for custom webservice endpoints or configuration.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@abstractmethod
|
||||||
|
def parse_incoming_message(cls, request) -> 'Message':
|
||||||
|
"""
|
||||||
|
Parses the incoming request and returns a :class:`butterrobot.objects.Message` instance.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@abstractmethod
|
||||||
|
def parse_channel_name_from_raw(cls, channel_raw) -> str:
|
||||||
|
"""
|
||||||
|
Extracts the Channel name from :class:`butterrobot.objects.Channel.channel_raw`.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@abstractmethod
|
||||||
|
def parse_channel_from_message(cls, channel_raw) -> 'Channel':
|
||||||
|
"""
|
||||||
|
Extracts the Channel raw data from the message received in the incoming webhook.
|
||||||
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class PlatformMethods:
|
class PlatformMethods:
|
||||||
@abstractclassmethod
|
@classmethod
|
||||||
def send_message(cls, message):
|
@abstractmethod
|
||||||
pass
|
def send_message(cls, message: 'Message'):
|
||||||
|
"""Method used to send a message via the platform"""
|
||||||
@abstractclassmethod
|
|
||||||
def reply_message(cls, message, reply_to):
|
|
||||||
pass
|
pass
|
||||||
|
|
16
tests/test_objects.py
Normal file
16
tests/test_objects.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
from butterrobot.objects import Channel, ChannelPlugin
|
||||||
|
|
||||||
|
|
||||||
|
def test_channel_has_enabled_plugin_ok():
|
||||||
|
channel = Channel(
|
||||||
|
platform="debug",
|
||||||
|
platform_channel_id="debug",
|
||||||
|
channel_raw={},
|
||||||
|
plugins={
|
||||||
|
"enabled": ChannelPlugin(id=1, channel_id="test", plugin_id="enabled", enabled=True),
|
||||||
|
"existant": ChannelPlugin(id=2, channel_id="test", plugin_id="existant"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
assert not channel.has_enabled_plugin("non.existant")
|
||||||
|
assert not channel.has_enabled_plugin("existant")
|
||||||
|
assert channel.has_enabled_plugin("enabled")
|
Loading…
Add table
Add a link
Reference in a new issue