예제 #1
0
 def test_nested_object_roundtrip(self):
     obj = Assembly.loads(AssemblyTester.data)
     text = textwrap.dedent(Assembly.dumps(obj))
     rv = Assembly.loads(text)
     self.assertEqual(obj.bucket, rv.bucket)
     self.assertEqual(obj.wheel, rv.wheel)
     self.assertEqual(obj.handles, rv.handles)
예제 #2
0
 def test_nested_object_roundtrip(self):
     obj = Assembly.loads(AssemblyTester.data)
     text = textwrap.dedent(Assembly.dumps(obj))
     rv = Assembly.loads(text)
     self.assertEqual(obj.bucket, rv.bucket)
     self.assertEqual(obj.wheel, rv.wheel)
     self.assertEqual(obj.handles, rv.handles)
예제 #3
0
    def test_numeric_types(self):
        val = decimal.Decimal("3.14")
        rv = Assembly.dumps(val)
        self.assertEqual("3.14", rv)
        self.assertEqual(val, Assembly.loads(rv))

        val = complex("3+14j")
        rv = Assembly.dumps(val)
        self.assertEqual('"(3+14j)"', rv)
        self.assertEqual(val, complex(Assembly.loads(rv).replace('"', "")))
예제 #4
0
 def test_assemble_spot(self):
     obj = list(Spot)[0]
     data = Assembly.dumps(obj)
     self.assertTrue(data)
     rv = Assembly.loads(data)
     self.assertIsInstance(rv, Spot)
     self.assertEqual(obj.value, rv.value)
예제 #5
0
 def test_loads_bad_header(self):
     data = textwrap.dedent("""
     {
     "_type": "turberfield.ipc.message.Message",
     "header": {
         "_type": "turberfield.ipc.message.Header",
         "id": "aa27e84fa93843658bfcd5b4f9ceee4f",
         "src": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.sender"
         },
         "dst": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.receiver"
         },
         "hMax": 3,
         "hop": 0
     },
     "payload": []
     }
     """)
     with warnings.catch_warnings(record=True) as w:
         warnings.simplefilter("always")
         msg = Assembly.loads(data)
         self.assertEqual(1, len(w))
         self.assertTrue(issubclass(w[-1].category, UserWarning))
         self.assertIn("Parameter mismatch", str(w[-1].message))
예제 #6
0
    def test_ready_narrator_01(self):
        Assembly.register(AssemblyTests.ForeignState)
        narrator = bluemonday78.story.build_narrator().set_state(
            AssemblyTests.ForeignState.hostile)
        self.assertTrue(hasattr(narrator, "memories"))
        self.assertIsInstance(narrator.memories, collections.deque)
        narrator.memories.extend(range(4))
        self.assertEqual(197801160800, narrator.state)
        self.assertEqual(4, len(narrator.memories))
        self.assertEqual(3, len(narrator._states))

        text = Assembly.dumps(narrator)
        clone = Assembly.loads(text)
        self.assertEqual(narrator.id, clone.id)
        self.assertTrue(hasattr(clone, "memories"))
        self.assertIsInstance(clone.memories, list)
        self.assertEqual(4, len(clone.memories))
        self.assertEqual(3, len(narrator._states))

        # Check state transfer
        self.assertEqual(197801160800, clone.state)
        clone.state = 0

        result = bluemonday78.story.build_narrator(id=None,
                                                   memories=clone.memories,
                                                   _states=clone._states)
        self.assertNotEqual(clone.id, result.id)
        self.assertTrue(hasattr(result, "memories"))
        self.assertIsInstance(result.memories, collections.deque)
        self.assertEqual(4, len(result.memories))
        self.assertEqual(0, result.state)
        self.assertEqual(3, len(result._states))
        self.assertEqual(AssemblyTests.ForeignState.hostile,
                         result.get_state(AssemblyTests.ForeignState))
예제 #7
0
 def test_volume_roundtrip(self):
     # https://bugs.python.org/issue23572
     # requires Python 3.5.1
     vol = Volume.bundle
     text = Assembly.dumps(vol)
     rv = Assembly.loads(text)
     self.assertEqual(vol, rv)
예제 #8
0
 def test_nested_object_extraloads(self):
     data = AssemblyTester.data[:-3] + textwrap.dedent("""
     ,{
         "_type": "turberfield.utils.test.test_assembly.Handle",
         "length": 80,
         "grip": {
             "_type": "turberfield.utils.test.test_assembly.Grip",
             "length": 15,
             "colour": {
                 "_type": "turberfield.utils.test.test_assembly.Colour",
                 "name": "red",
                 "value": [
                     0,
                     255,
                     0
                 ]
             }
         }
     }
     ]}""")
     rv = Assembly.loads(data)
     self.assertIsInstance(rv, Wheelbarrow)
     self.assertIsInstance(rv.handles, deque)
     self.assertEqual(2, len(rv.handles))
     self.assertEqual(Wheelbarrow.Colour.green, rv.handles[0].grip.colour)
     self.assertEqual(Wheelbarrow.Colour.red, rv.handles[1].grip.colour)
예제 #9
0
 def test_loads_bad_header(self):
     data = textwrap.dedent("""
     {
     "_type": "turberfield.ipc.message.Message",
     "header": {
         "_type": "turberfield.ipc.message.Header",
         "id": "aa27e84fa93843658bfcd5b4f9ceee4f",
         "src": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.sender"
         },
         "dst": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.receiver"
         },
         "hMax": 3,
         "hop": 0
     },
     "payload": []
     }
     """)
     with warnings.catch_warnings(record=True) as w:
         warnings.simplefilter("always")
         msg = Assembly.loads(data)
         self.assertEqual(1, len(w))
         self.assertTrue(
             issubclass(w[-1].category, UserWarning))
         self.assertIn("Parameter mismatch", str(w[-1].message))
예제 #10
0
 def test_nested_object_dumps(self):
     obj = Assembly.loads(AssemblyTester.data)
     text = Assembly.dumps(obj, indent=4)
     self.assertEqual(
         len(AssemblyTester.data.strip()),
         len(text.strip())
     )
예제 #11
0
 def test_nested_object_extraloads(self):
     data = AssemblyTester.data[:-3] + textwrap.dedent("""
     ,{
         "_type": "turberfield.utils.test.test_assembly.Handle",
         "length": 80,
         "grip": {
             "_type": "turberfield.utils.test.test_assembly.Grip",
             "length": 15,
             "colour": {
                 "_type": "turberfield.utils.test.test_assembly.Colour",
                 "name": "red",
                 "value": [
                     0,
                     255,
                     0
                 ]
             }
         }
     }
     ]}""")
     rv = Assembly.loads(data)
     self.assertIsInstance(rv, Wheelbarrow)
     self.assertIsInstance(rv.handles, deque)
     self.assertEqual(2, len(rv.handles))
     self.assertEqual(Wheelbarrow.Colour.green, rv.handles[0].grip.colour)
     self.assertEqual(Wheelbarrow.Colour.red, rv.handles[1].grip.colour)
예제 #12
0
 def test_round_trip_assembly(self):
     Assembly.register(Player)
     player = Player(name="Mr Dick Turpin").set_state(12)
     text = Assembly.dumps(player)
     clone = Assembly.loads(text)
     self.assertEqual(player.id, clone.id)
     self.assertEqual(player.name, clone.name)
     self.assertEqual(player.state, clone.state)
예제 #13
0
 def test_nested_object_loads(self):
     rv = Assembly.loads(AssemblyTester.data)
     self.assertIsInstance(rv, Wheelbarrow)
     self.assertEqual(45, rv.bucket.capacity)
     self.assertIsInstance(rv.wheel.rim.dia, Decimal)
     self.assertEqual(30, rv.wheel.tyre.pressure)
     self.assertIsInstance(rv.handles, deque)
     self.assertEqual(2, len(rv.handles))
     self.assertEqual(Wheelbarrow.Colour.green, rv.handles[0].grip.colour)
예제 #14
0
 def test_nested_object_loads(self):
     rv = Assembly.loads(AssemblyTester.data)
     self.assertIsInstance(rv, Wheelbarrow)
     self.assertEqual(45, rv.bucket.capacity)
     self.assertIsInstance(rv.wheel.rim.dia, Decimal)
     self.assertEqual(30, rv.wheel.tyre.pressure)
     self.assertIsInstance(rv.handles, deque)
     self.assertEqual(2, len(rv.handles))
     self.assertEqual(Wheelbarrow.Colour.green, rv.handles[0].grip.colour)
예제 #15
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))
예제 #16
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)")
예제 #17
0
 def test_belt_roundtrip(self):
     inventory = Counter(
         itertools.chain((String(1), Glyph("snake")),
         itertools.repeat(Shell("white"), 64))
     )
     inventory[Wampum.build(inventory)] += 1
     belt = Belt.build(inventory, maxlen=3)
     text = Assembly.dumps(belt)
     obj = Assembly.loads(text)
     self.assertEqual(
         66, sum(dict(obj.requirements()).values())
     )
     self.assertEqual(belt.memory, obj.memory)
예제 #18
0
 def test_loads_empty_payload(self):
     data = textwrap.dedent("""
     {
     "_type": "turberfield.ipc.message.Message",
     "header": {
         "_type": "turberfield.ipc.message.Header",
         "id": "aa27e84fa93843658bfcd5b4f9ceee4f",
         "src": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.sender"
         },
         "dst": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.receiver"
         },
         "hMax": 3,
         "via": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.hub"
         },
         "hop": 0
     },
     "payload": []
     }
     """)
     msg = Assembly.loads(data)
     self.assertIsInstance(msg, turberfield.ipc.message.Message)
     self.assertIsInstance(msg.header, turberfield.ipc.message.Header)
     self.assertIsInstance(msg.header.src, turberfield.ipc.types.Address)
     self.assertEqual("turberfield.ipc.demo.sender",
                      msg.header.src.application)
     self.assertIsInstance(msg.header.dst, turberfield.ipc.types.Address)
     self.assertEqual("turberfield.ipc.demo.receiver",
                      msg.header.dst.application)
     self.assertIsInstance(msg.header.via, turberfield.ipc.types.Address)
     self.assertEqual("turberfield.ipc.demo.hub",
                      msg.header.via.application)
     self.assertIsInstance(msg.payload, list)
     self.assertFalse(msg.payload)
예제 #19
0
    def datagram_received(self, data, addr):
        """
        Routing only. Provides no upward service.

        """
        packet = self.decoder.send(data)
        if packet is None:
            return (None, None)

        msg = Assembly.loads(packet)
        poa, msg = self.hop(self.token, msg, policy="udp")
        if poa is not None:
            remote_addr = (poa.addr, poa.port)
            data = Assembly.dumps(msg)
            packet = dumpb(data)
            self.transport.sendto(packet, remote_addr)
        return (poa, msg)
예제 #20
0
    def datagram_received(self, data, addr):
        """
        Routing only. Provides no upward service.

        """
        packet = self.decoder.send(data)
        if packet is None:
            return (None, None)

        msg = Assembly.loads(packet)
        poa, msg = self.hop(self.token, msg, policy="udp")
        if poa is not None:
            remote_addr = (poa.addr, poa.port)
            data = Assembly.dumps(msg)
            packet = dumpb(data)
            self.transport.sendto(packet, remote_addr)
        return (poa, msg)
예제 #21
0
 def test_loads_empty_payload(self):
     data = textwrap.dedent("""
     {
     "_type": "turberfield.ipc.message.Message",
     "header": {
         "_type": "turberfield.ipc.message.Header",
         "id": "aa27e84fa93843658bfcd5b4f9ceee4f",
         "src": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.sender"
         },
         "dst": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.receiver"
         },
         "hMax": 3,
         "via": {
             "_type": "turberfield.ipc.types.Address",
             "namespace": "turberfield",
             "user": "******",
             "service": "test",
             "application": "turberfield.ipc.demo.hub"
         },
         "hop": 0
     },
     "payload": []
     }
     """)
     msg = Assembly.loads(data)
     self.assertIsInstance(msg, turberfield.ipc.message.Message)
     self.assertIsInstance(msg.header, turberfield.ipc.message.Header)
     self.assertIsInstance(msg.header.src, turberfield.ipc.types.Address)
     self.assertEqual("turberfield.ipc.demo.sender", msg.header.src.application)
     self.assertIsInstance(msg.header.dst, turberfield.ipc.types.Address)
     self.assertEqual("turberfield.ipc.demo.receiver", msg.header.dst.application)
     self.assertIsInstance(msg.header.via, turberfield.ipc.types.Address)
     self.assertEqual("turberfield.ipc.demo.hub", msg.header.via.application)
     self.assertIsInstance(msg.payload, list)
     self.assertFalse(msg.payload)
예제 #22
0
 def test_glyph_roundtrip(self):
     obj = Glyph("eagle")
     text = Assembly.dumps(obj)
     rv = Assembly.loads(text)
     self.assertEqual(obj, rv)
예제 #23
0
 def test_nested_object_dumps(self):
     obj = Assembly.loads(AssemblyTester.data)
     text = Assembly.dumps(obj, indent=4)
     self.assertEqual(len(AssemblyTester.data.strip()), len(text.strip()))
예제 #24
0
 def test_shell_roundtrip(self):
     obj = Shell("pink")
     text = Assembly.dumps(obj)
     rv = Assembly.loads(text)
     self.assertEqual(obj, rv)
예제 #25
0
 def test_pellets_roundtrip(self):
     obj = Pellets.bag
     text = Assembly.dumps(obj)
     rv = Assembly.loads(text)
     self.assertEqual(obj, rv)
예제 #26
0
 def test_string_roundtrip(self):
     obj = String(3)
     text = Assembly.dumps(obj)
     rv = Assembly.loads(text)
     self.assertEqual(obj, rv)
예제 #27
0
 def test_length_roundtrip(self):
     obj = Length.metre
     text = Assembly.dumps(obj)
     rv = Assembly.loads(text)
     self.assertEqual(obj, rv)
예제 #28
0
 def test_enums_can_be_assembled(self):
     self.assertTrue(Assembly.register(Map.Arriving))
     rv = Assembly.dumps(Map.Arriving.car_park)
     self.assertEqual(Map.Arriving.car_park, Assembly.loads(rv), rv)