Ejemplo n.º 1
0
    def test_assembly(self):
        narrator = bluemonday78.story.build_narrator()
        ensemble = bluemonday78.story.ensemble(narrator)
        text = Assembly.dumps(ensemble)
        clone = Assembly.loads(text)

        self.assertEqual(
            set(group_by_type(ensemble).keys()),
            set(group_by_type(clone).keys()),
            "Check all ensemble classes permit re-assembly (DataObject)")
Ejemplo n.º 2
0
 def setUp(self):
     self.ensemble = ensemble()
     self.schedule = [copy.deepcopy(folder)]
     self.characters = {
         k.__name__: v
         for k, v in group_by_type(self.ensemble).items()
     }
Ejemplo n.º 3
0
 def setUpClass(cls):
     cls.asscns = associations()
     cls.ensemble = list(cls.asscns.ensemble()) + [
         Player(name="Player").set_state(Spot.grid_1205).set_state(Time.eve_predawn)
     ]
     cls.dialogue = copy.deepcopy(episodes)
     cls.characters = {
         k.__name__: v for k, v in group_by_type(cls.ensemble).items()
     }
     cls.performer = Performer(cls.dialogue, cls.ensemble)
Ejemplo n.º 4
0
    def test_empty_entitys(self):
        content = textwrap.dedent("""
            .. entity:: FIGHTER_1

            .. entity:: FIGHTER_2

            .. entity:: WEAPON

            """)
        objs = SceneScript.read(content)
        groups = group_by_type(objs)
        self.assertEqual(3, len(groups[Entity.Declaration]), groups)
Ejemplo n.º 5
0
    def select(self, personae, relative=False, roles=1):
        """Select a persona for each entity declared in the scene.

        :param personae: A sequence of Personae.
        :param bool relative: Affects imports from namespace packages.
            Used for testing only.
        :param int roles: The maximum number of roles allocated to each persona.
        :return: An OrderedDict of {Entity: Persona}.

        """
        def constrained(entity):
            return (len(entity["options"].get("types", [])) +
                    len(entity["options"].get("states", [])))

        rv = OrderedDict()
        performing = defaultdict(set)
        pool = list(personae)
        self.log.debug(pool, {"path": self.fP})
        entities = OrderedDict([("".join(entity.attributes["names"]), entity)
                                for entity in sorted(group_by_type(self.doc)[
                                    EntityDirective.Declaration],
                                                     key=constrained,
                                                     reverse=True)])
        for e in entities.values():
            types = tuple(
                filter(None, (e.string_import(t, relative)
                              for t in e["options"].get("types", []))))
            states = tuple(
                filter(
                    None,
                    (int(t) if t.isdigit() else e.string_import(t, relative)
                     for t in e["options"].get("states", []))))
            otherRoles = {i.lower() for i in e["options"].get("roles", [])}
            typ = types or object
            persona = next(
                (i for i in pool if isinstance(i, typ)
                 and getattr(i, "get_state", not states) and all(
                     str(i.get_state(type(s))).startswith(str(s))
                     for s in states) and
                 (performing[i].issubset(otherRoles) or not otherRoles)), None)
            rv[e] = persona
            performing[persona].update(set(e.attributes["names"]))

            if not otherRoles or list(rv.values()).count(persona) == roles:
                try:
                    pool.remove(persona)
                except ValueError:
                    self.log.debug(
                        "No persona for type {0} and states {1} with {2} {3}.".
                        format(typ, states, roles,
                               "role" if roles == 1 else "roles"),
                        {"path": self.fP})
        return rv
Ejemplo n.º 6
0
 def test_group_by_type(self):
     items = [1, 0, "b", 0.8, "a", 0.3, 4]
     rv = group_by_type(items)
     self.assertEqual([1, 0, 4], rv[int])
     self.assertEqual(["b", "a"], rv[str])
     self.assertEqual([0.8, 0.3], rv[float])
Ejemplo n.º 7
0
 def create(cls, script):
     full_name = "{0}.{1}".format(cls.__module__, cls.__qualname__)
     entities = group_by_type(script.doc)[Entity.Declaration]
     for entity in entities:
         if full_name in entity.get("options", {}).get("types", []):
             yield cls(name=cls.name_from_entity(entity))
Ejemplo n.º 8
0
 def entity_states(folder):
     for script in SceneScript.scripts(**folder._asdict()):
         with script as dialogue:
             entities = group_by_type(dialogue.doc)[Entity.Declaration]
             for entity in entities:
                 yield from entity["options"].get("states", [])