Exemple #1
0
async def get_frame(request):
    uid = uuid.UUID(hex=request.match_info["session"])
    try:
        presenter = request.app["sessions"][uid]
    except KeyError:
        raise web.HTTPUnauthorized(
            reason="Session {0!s} not found.".format(uid))

    if not presenter.pending:
        presenter.log.debug("No frames pending. Finding new dialogue.")
        narrator = presenter.ensemble[-1]
        pathway = narrator.get_state(Spot).value
        matcher = MultiMatcher(request.app["folders"])
        folders = list(matcher.options(pathways=set([pathway])))
        dialogue = presenter.dialogue(folders, presenter.ensemble)
        request.app["sessions"][uid] = presenter = Presenter(
            dialogue, presenter.ensemble)

    try:
        frame = presenter.frame()
    except IndexError:
        raise web.HTTPFound("/{0.hex}/map".format(uid))

    pending = presenter.pending
    return web.Response(text=bluemonday78.render.body_html(
        refresh=Presenter.refresh_animations(frame)
        if pending else None, ).format(
            bluemonday78.render.dict_to_css(presenter.definitions),
            bluemonday78.render.frame_to_html(frame, presenter.ensemble,
                                              not pending)),
                        content_type="text/html")
Exemple #2
0
 def test_epilogue_frame(self):
     dialogue = self.presenter.dialogue(self.folders, self.ensemble)
     presenter = Presenter(dialogue)
     while presenter.pending:
         frame = presenter.frame()
     rv = bluemonday78.render.frame_to_html(frame)
     self.assertEqual(1, rv.count("<audio"))
Exemple #3
0
 def test_prologue_frame(self):
     dialogue = self.presenter.dialogue(self.folders, self.ensemble)
     presenter = Presenter(dialogue)
     frame = presenter.frame()
     rv = bluemonday78.render.frame_to_html(frame)
     self.assertEqual(1, rv.count('<blockquote class="obj-line">'), rv)
     self.assertEqual(3, rv.count("<img "))
 def test_frame(self):
     dialogue = self.presenter.dialogue(self.folders, self.ensemble)
     presenter = Presenter(dialogue)
     shot_index = 0
     self.assertEqual(10, self.ensemble[0].state)
     while presenter.pending:
         with self.subTest(shot_index=shot_index):
             frame = presenter.frame()
             self.assertTrue(frame)
             shot_index += 1
     self.assertEqual(3, shot_index)
     self.assertEqual(20, self.ensemble[0].state)
 def test_option_0(self):
     dialogue = self.presenter.dialogue(self.folders, self.ensemble)
     presenter = Presenter(dialogue)
     while presenter.pending != 1:
         frame = presenter.frame()
     self.assertEqual(0, len(frame[Model.Still]))
     self.assertEqual(1, len(frame[Model.Line]))
     self.assertEqual(0, len(frame[Model.Audio]))
     self.assertTrue(
         all(isinstance(i, Presenter.Animation) for i in frame[Model.Line]))
     self.assertTrue(
         all(isinstance(i.element, Model.Line) for i in frame[Model.Line]))
     self.assertEqual("On.", frame[Model.Line][0].element.text)
Exemple #6
0
async def post_hop(request):
    uid = uuid.UUID(hex=request.match_info["session"])
    try:
        presenter = request.app["sessions"][uid]
    except KeyError:
        raise web.HTTPUnauthorized(
            reason="Session {0!s} not found.".format(uid))

    data = await request.post()
    location_id = uuid.UUID(hex=data["location_id"])
    location = next(
        bluemonday78.story.search(presenter.ensemble, id=location_id))
    spot = location.get_state(Spot)

    narrator = presenter.ensemble[-1]
    narrator.set_state(spot)
    presenter.log.debug("Hopped to {0}".format(spot))

    pathway = spot.value
    matcher = MultiMatcher(request.app["folders"])
    folders = list(matcher.options(pathways=set([pathway])))
    dialogue = presenter.dialogue(folders, presenter.ensemble)
    if dialogue is None:
        request.app["log"].info("No new dialogue cast. Check selection.")
    else:
        request.app["sessions"][uid] = Presenter(dialogue, presenter.ensemble)
    raise web.HTTPFound("/{0.hex}".format(uid))
Exemple #7
0
async def post_titles(request):
    config = next(iter(request.app["config"]), None)
    data = await request.post()
    assembly_url = data.get("assembly_url")
    ensemble = []
    if assembly_url and config and config.getboolean(
            "assembly", "enable_load", fallback=False):
        if not Presenter.validation["url"].match(assembly_url):
            raise web.HTTPUnauthorized(reason="User requested invalid URL.")

        try:
            async with request.app["client"].get(assembly_url,
                                                 trace_request_ctx={
                                                     "log_name": "app.client"
                                                 }) as response:

                if response.status != 200:
                    raise web.HTTPUnauthorized(reason=response.reason)

                text = await (response.text())
                try:
                    assembly = Assembly.loads(text)
                    ensemble = assembly.get("ensemble")
                except Exception as e:
                    request.app["log"].error(e)
                    raise web.HTTPUnauthorized(reason="Invalid data.")

        except (
                aiohttp.ClientResponseError,
                aiohttp.ClientConnectionError,
                aiohttp.ClientPayloadError,
                asyncio.TimeoutError,
        ) as e:
            request.app["log"].error(e)

        try:
            clone = next(i for i in reversed(ensemble)
                         if isinstance(i, Narrator))
            narrator = bluemonday78.story.build_narrator(
                id=None, memories=clone.memories, _states=clone._states)
            ensemble.remove(clone)
            ensemble.append(narrator)
        except:
            ensemble = None

    if not ensemble:
        narrator = bluemonday78.story.build_narrator()
        ensemble = bluemonday78.story.ensemble(narrator)
    else:
        request.app["log"].info("Load successful from assembly")

    presenter = Presenter(None, ensemble)
    presenter.log.debug(narrator)
    request.app["sessions"][narrator.id] = presenter
    request.app["log"].info("session: {0.id.hex}".format(narrator))
    raise web.HTTPFound("/{0.id.hex}".format(narrator))
 def test_prologue(self):
     dialogue = self.presenter.dialogue(self.folders, self.ensemble)
     presenter = Presenter(dialogue)
     frame = presenter.frame()
     self.assertEqual(3, len(frame[Model.Still]))
     self.assertEqual(0, len(frame[Model.Audio]))
     self.assertTrue(
         all(
             isinstance(i, Presenter.Animation)
             for i in frame[Model.Still]))
     self.assertTrue(
         all(
             isinstance(i.element, Model.Still)
             for i in frame[Model.Still]))
     self.assertEqual(20, max(i.duration for i in frame[Model.Still]))
     self.assertEqual(20000,
                      max(i.element.duration for i in frame[Model.Still]))
     self.assertEqual(1, len(frame[Model.Line]))
     self.assertTrue(
         all(isinstance(i, Presenter.Animation) for i in frame[Model.Line]))
     self.assertTrue(
         all(isinstance(i.element, Model.Line) for i in frame[Model.Line]))
 def setUp(self):
     self.folders = [
         SceneScript.Folder(pkg="bluemonday78",
                            description="A Spike for Folder patterns.",
                            metadata={"location": "inner"},
                            paths=[
                                "dialogue/outer/inner/story/scene_01.rst",
                            ],
                            interludes=itertools.repeat(None))
     ]
     self.ensemble = [
         Character(name="A Test Actor").set_state(10),
         bluemonday78.story.build_narrator()
     ]
     self.presenter = Presenter(None, self.ensemble)