コード例 #1
0
ファイル: app.py プロジェクト: yws/Kyoukai
    def run(self, ip: str = "127.0.0.1", port: int = 4444, *, component=None):
        """
        Runs the Kyoukai server from within your code.

        This is not normally invoked - instead Asphalt should invoke the Kyoukai component.
        However, this is here for convenience.
        """
        if not component:
            from kyoukai.asphalt import KyoukaiComponent
            component = KyoukaiComponent(self, ip, port)

        run_application(component)
コード例 #2
0
ファイル: client.py プロジェクト: jd-258/asphalt
"""This is the client code for the Asphalt echo server tutorial."""
import sys
from asyncio import get_event_loop, open_connection

from asphalt.core import Component, run_application


class ClientComponent(Component):
    def __init__(self, message: str):
        self.message = message

    async def start(self, ctx):
        reader, writer = await open_connection('localhost', 64100)
        writer.write(self.message.encode() + b'\n')
        response = await reader.readline()
        writer.close()
        print('Server responded:', response.decode().rstrip())
        get_event_loop().stop()


if __name__ == '__main__':
    msg = sys.argv[1]
    component = ClientComponent(msg)
    run_application(component)
コード例 #3
0
from asphalt.core import CLIApplicationComponent, Context, run_application
from asphalt.serialization.serializers.cbor import CBORSerializer

logger = logging.getLogger(__name__)


class FileGetterComponent(CLIApplicationComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp', serializer=CBORSerializer())
        await super().start(ctx)

    async def run(self, ctx: Context):
        def on_progress(data: bytes):
            # This gets called for every chunk the server sends (ctx.progress() on the other side)
            outfile.write(data)
            print('\r{} bytes written'.format(outfile.tell()), end='')

        remote_path = sys.argv[1]
        local_path = Path(mkdtemp()) / Path(remote_path).name
        with local_path.open('wb') as outfile:
            await ctx.wamp.call('send_file', remote_path, on_progress=on_progress)

        print('\nFile saved as %s' % local_path)


if len(sys.argv) < 2:
    print('Usage: {} <file path>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(FileGetterComponent(), logging=logging.INFO)
コード例 #4
0
ファイル: client.py プロジェクト: asphalt-framework/asphalt
"""This is the client code for the Asphalt echo server tutorial."""
import sys
from asyncio import open_connection

from asphalt.core import CLIApplicationComponent, run_application


class ClientComponent(CLIApplicationComponent):
    def __init__(self, message: str):
        super().__init__()
        self.message = message

    async def run(self, ctx):
        reader, writer = await open_connection('localhost', 64100)
        writer.write(self.message.encode() + b'\n')
        response = await reader.readline()
        writer.close()
        print('Server responded:', response.decode().rstrip())

if __name__ == '__main__':
    component = ClientComponent(sys.argv[1])
    run_application(component)
コード例 #5
0
    def __init__(self, attachment):
        super().__init__()
        self.attachment = attachment

    async def start(self, ctx: Context):
        self.add_component(
            "mailer", backend="smtp", host="smtp.example.org", ssl=True, username="******", password="******"
        )
        await super().start(ctx)

    async def run(self, ctx: Context):
        message = ctx.mailer.create_message(
            subject="Test email with attachment",
            sender="Sender <*****@*****.**>",
            to="Recipient <*****@*****.**>",
            plain_body="Take a look at this file!",
        )
        await ctx.mailer.add_file_attachment(message, self.attachment)
        await ctx.mailer.deliver(message)


if len(sys.argv) < 2:
    print("Specify the path to the attachment as the argument to this script!", file=sys.stderr)
    sys.exit(1)

if not os.path.isfile(sys.argv[1]):
    print("The attachment ({}) does not exist or is not a regular file", file=sys.stderr)
    sys.exit(2)

run_application(ApplicationComponent(sys.argv[1]), logging=logging.DEBUG)
コード例 #6
0
"""This example demonstrates how to publish messages with WAMP."""

import logging
import sys

from asphalt.core import CLIApplicationComponent, Context, run_application

logger = logging.getLogger(__name__)


class PublisherComponent(CLIApplicationComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp')
        await super().start(ctx)

    async def run(self, ctx: Context):
        topic, message = sys.argv[1:3]
        await ctx.wamp.publish(topic, message)


if len(sys.argv) < 3:
    print('Usage: {} <topic> <message>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(PublisherComponent(), logging=logging.INFO)
コード例 #7
0
"""This example demonstrates how to find out the caller's authentication ID (username)."""

import logging

from asphalt.core import ContainerComponent, Context, run_application
from asphalt.wamp.context import CallContext


def hello(ctx: CallContext):
    return 'Hello, {}!'.format(ctx.caller_auth_id)


class RPCServerComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp',
                           url='ws://localhost:8080',
                           auth_method='wampcra',
                           auth_id='testserver',
                           auth_secret='server123')
        await super().start(ctx)

        await ctx.wamp.register_procedure(hello, 'hello')


run_application(RPCServerComponent(), logging=logging.INFO)
コード例 #8
0
        # Remove the db file if it exists
        db_path = self.csv_path.with_name('people.db')
        if db_path.exists():
            db_path.unlink()

        self.add_component('sqlalchemy', url='sqlite:///{}'.format(db_path))
        await super().start(ctx)

        # Create the table in a subcontext – never use connections or sessions from a long lived
        # context!
        async with Context(ctx):
            Base.metadata.create_all(ctx.sql.bind)

    async def run(self, ctx: Context):
        async with ctx.threadpool():
            num_rows = 0
            with self.csv_path.open() as csvfile:
                reader = csv.reader(csvfile, delimiter='|')
                for name, city, phone, email in reader:
                    num_rows += 1
                    ctx.sql.add(
                        Person(name=name, city=city, phone=phone, email=email))

            # Emit pending INSERTs (though this would happen when the context ends anyway)
            ctx.sql.flush()

        logger.info('Imported %d rows of data', num_rows)


run_application(CSVImporterComponent(), logging=logging.DEBUG)
コード例 #9
0
"""
This example demonstrates how to find out the caller's authentication ID (username).
It should be noted that for this to work with Crossbar at least, caller disclosure must be enabled
in the authentication configuration.
"""

import logging

from asphalt.core import ContainerComponent, Context, run_application
from asphalt.wamp.context import CallContext


def hello(ctx: CallContext):
    return 'Hello, {}!'.format(ctx.caller_auth_id)


class RPCServerComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp', auth_method='wampcra',
                           auth_id='testserver', auth_secret='server123')
        await super().start(ctx)

        await ctx.wamp.register(hello, 'hello')


run_application(RPCServerComponent(), logging=logging.INFO)
コード例 #10
0
class ApplicationrComponent(ContainerComponent):
    async def start(self, ctx: Context):
        csv_path = Path(__file__).with_name('people.csv')
        db_path = csv_path.with_name('people.db')

        # Remove any existing db file
        if db_path.exists():
            db_path.unlink()

        self.add_component('sqlalchemy', url='sqlite:///{}'.format(db_path),
                           metadata=Base.metadata)
        await super().start(ctx)

        # Create the table
        Base.metadata.create_all()

        async with threadpool():
            num_rows = 0
            with csv_path.open() as csvfile:
                reader = csv.reader(csvfile, delimiter='|')

                # Import each row into the session as a new Person instance
                for name, city, phone, email in reader:
                    num_rows += 1
                    ctx.dbsession.add(Person(name=name, city=city, phone=phone, email=email))

        logger.info('Imported %d rows of data', num_rows)
        asyncio.get_event_loop().stop()

run_application(ApplicationrComponent(), logging=logging.DEBUG)
コード例 #11
0
def main(host, username, password, sender, to, subject, attachment):
    component = ApplicationComponent(host, username, password, sender, to,
                                     subject, attachment)
    run_application(component, logging=logging.INFO)
コード例 #12
0
logger = logging.getLogger(__name__)


class FileGetterComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp', url='ws://localhost:8080')
        await super().start(ctx)

        def on_progress(data: bytes):
            # This gets called for every chunk the server sends (ctx.progress() on the other side)
            outfile.write(data)
            print('\r{} bytes written'.format(outfile.tell()), end='')

        remote_path = sys.argv[1]
        local_path = Path(mkdtemp()) / Path(remote_path).name
        with local_path.open('wb') as outfile:
            await ctx.wamp.call('send_file',
                                remote_path,
                                on_progress=on_progress)

        print('\nFile saved as %s' % local_path)
        asyncio.get_event_loop().stop()


if len(sys.argv) < 2:
    print('Usage: {} <file path>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(FileGetterComponent(), logging=logging.INFO)
コード例 #13
0
"""
This example demonstrates how to publish messages with WAMP.

First start subscriber.py and take note of which port it's running on.
"""

import asyncio
import logging
import sys

from asphalt.core import ContainerComponent, Context, run_application

logger = logging.getLogger(__name__)


class PublisherComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp', url='ws://localhost:8080')
        await super().start(ctx)

        topic, message = sys.argv[1:3]
        await ctx.wamp.publish(topic, message)
        asyncio.get_event_loop().stop()


if len(sys.argv) < 3:
    print('Usage: {} <topic> <message>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(PublisherComponent(), logging=logging.INFO)
コード例 #14
0
"""A simple example that serializes a dictionary and prints out the result."""
import asyncio

from asphalt.core import ContainerComponent, Context, run_application


class ApplicationComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('serialization', backend='json')
        await super().start(ctx)

        payload = ctx.json.serialize(
            {'a': 1, 'b': 5.03, 'c': [1, 2, 3], 'd': {'x': 'nested'}})
        print('JSON serialized dict:', payload.decode())
        asyncio.get_event_loop().stop()

run_application(ApplicationComponent())
コード例 #15
0
and use PackageLoader with the ``package_name`` option so they can be accessed
regardless of where the application has been installed.
"""

from pathlib import Path
from uuid import uuid1

from asphalt.core import CLIApplicationComponent, Context, run_application
from jinja2 import FileSystemLoader


class ApplicationComponent(CLIApplicationComponent):
    async def start(self, ctx: Context):
        this_directory = str(Path(__file__).parent)
        self.add_component(
            "templating",
            backend="jinja2",
            options={
                "loader_class": FileSystemLoader,
                "searchpath": this_directory,
            },
        )
        await super().start(ctx)

    async def run(self, ctx: Context):
        rendered = ctx.jinja2.render("demo.jinja2", uuid=uuid1())
        print(rendered)


run_application(ApplicationComponent())
コード例 #16
0
"""This example demonstrates how to subscribe to topics with WAMP."""

import logging
import sys

from asphalt.core import ContainerComponent, Context, run_application
from asphalt.wamp.context import EventContext

logger = logging.getLogger(__name__)


def subscriber(ctx: EventContext, message: str):
    logger.info('Received message from %s: %s', ctx.topic, message)


class SubscriberComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp')
        await super().start(ctx)

        topic = sys.argv[1]
        await ctx.wamp.subscribe(subscriber, topic)
        logger.info('Subscribed to topic: %s', topic)


if len(sys.argv) < 2:
    print('Usage: {} <topic>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(SubscriberComponent(), logging=logging.INFO)
コード例 #17
0
def stream(url, interval):
    component = FeedReaderApp(url, interval)
    run_application(component)
コード例 #18
0
from asphalt.core import ContainerComponent, Context, run_application
from asphalt.wamp.context import CallContext, EventContext
from asphalt.wamp.registry import WAMPRegistry

topics = WAMPRegistry('topics')
procedures = WAMPRegistry('test')


@procedures.procedure
async def reverse(ctx: CallContext, message: str):
    return message[::-1]


@topics.subscriber('subtopic')
async def subtopic(ctx: EventContext, message):
    print('message received from topic.subtopic: %s' % message)


class RPCServerComponent(ContainerComponent):
    async def start(self, ctx: Context):
        registry = WAMPRegistry()
        registry.add_from(topics)
        registry.add_from(procedures)
        self.add_component('wamp', registry=registry)
        await super().start(ctx)
        await ctx.wamp.connect()


run_application(RPCServerComponent(), logging=logging.DEBUG)
コード例 #19
0
"""
This example WAMP client first calls the ``test.reverse`` remote method with string given as the
command line. It then publishes the return value on the ``topics.subtopic`` topic.
"""

import logging
import sys

from asphalt.core import CLIApplicationComponent, Context, run_application


class RPCClientComponent(CLIApplicationComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp')
        await super().start(ctx)

    async def run(self, ctx: Context):
        message = sys.argv[1]
        result = await ctx.wamp.call('test.reverse', message)
        await ctx.wamp.publish('topics.subtopic', result)


if len(sys.argv) < 2:
    print('Usage: {} <text>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(RPCClientComponent(), logging=logging.INFO)
コード例 #20
0
"""
This example WAMP client first calls the ``test.reverse`` remote method with string given as the
command line. It then publishes the return value on the ``topic.subtopic`` topic.
"""

import asyncio
import logging
import sys

from asphalt.core import ContainerComponent, Context, run_application


class RPCClientComponent(ContainerComponent):
    async def start(self, ctx: Context):
        self.add_component('wamp', url='ws://localhost:8080')
        await super().start(ctx)

        message = sys.argv[1]
        result = await ctx.wamp.call('test.reverse', message)
        await ctx.wamp.publish('topic.subtopic', result)
        asyncio.get_event_loop().stop()


if len(sys.argv) < 2:
    print('Usage: {} <text>'.format(sys.argv[0]), file=sys.stderr)
    sys.exit(1)

run_application(RPCClientComponent(), logging=logging.INFO)
コード例 #21
0
def stream(interval):
    component = CustomFeedReaderApp(interval)
    run_application(component)