|
| 1 | +from unittest import TestCase |
| 2 | + |
| 3 | +from json_stream_rs_tokenizer import rust_tokenizer_or_raise |
| 4 | + |
| 5 | +import json_stream |
| 6 | +from json_stream import to_standard_types |
| 7 | +from json_stream.tokenizer import tokenize |
| 8 | + |
| 9 | + |
| 10 | +class TestBuffering(TestCase): |
| 11 | + def test_buffering(self): |
| 12 | + self._test_buffering(tokenizer=rust_tokenizer_or_raise()) |
| 13 | + |
| 14 | + def test_buffering_python_tokenizer(self): |
| 15 | + self._test_buffering(tokenizer=tokenize) |
| 16 | + |
| 17 | + def _test_buffering(self, tokenizer): |
| 18 | + happenings = [] |
| 19 | + |
| 20 | + def data_in_chunks(data, chunk_size=15): |
| 21 | + for i in range(0, len(data), chunk_size): |
| 22 | + part = data[i:i + chunk_size] |
| 23 | + happenings.append(('yield', part)) |
| 24 | + yield part |
| 25 | + |
| 26 | + json_string = b'{"tasks":[{"id":1,"title":"task1"},{"id":2,"title":"task2"},{"id":3,"title":"task3"}]}' |
| 27 | + stream = json_stream.load(data_in_chunks(json_string), tokenizer=tokenizer) |
| 28 | + |
| 29 | + for task in stream["tasks"]: |
| 30 | + happenings.append(('item', to_standard_types(task))) |
| 31 | + |
| 32 | + self.assertListEqual([ |
| 33 | + ('yield', b'{"tasks":[{"id"'), |
| 34 | + ('yield', b':1,"title":"tas'), |
| 35 | + ('yield', b'k1"},{"id":2,"t'), |
| 36 | + ('item', {'id': 1, 'title': 'task1'}), |
| 37 | + ('yield', b'itle":"task2"},'), |
| 38 | + ('item', {'id': 2, 'title': 'task2'}), |
| 39 | + ('yield', b'{"id":3,"title"'), |
| 40 | + ('yield', b':"task3"}]}'), |
| 41 | + ('item', {'id': 3, 'title': 'task3'}) |
| 42 | + ], happenings) |
0 commit comments