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")
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"))
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)
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))
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)