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)
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('"', "")))
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)
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))
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))
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)
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)
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))
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()) )
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)
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)
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_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)")
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)
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)
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)
def test_glyph_roundtrip(self): obj = Glyph("eagle") text = Assembly.dumps(obj) rv = Assembly.loads(text) self.assertEqual(obj, rv)
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()))
def test_shell_roundtrip(self): obj = Shell("pink") text = Assembly.dumps(obj) rv = Assembly.loads(text) self.assertEqual(obj, rv)
def test_pellets_roundtrip(self): obj = Pellets.bag text = Assembly.dumps(obj) rv = Assembly.loads(text) self.assertEqual(obj, rv)
def test_string_roundtrip(self): obj = String(3) text = Assembly.dumps(obj) rv = Assembly.loads(text) self.assertEqual(obj, rv)
def test_length_roundtrip(self): obj = Length.metre text = Assembly.dumps(obj) rv = Assembly.loads(text) self.assertEqual(obj, rv)
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)