Solution: collect packets
The implementation
class Packets():
def __init__(self, filename):
self.filename = filename
self.fh = open(filename)
self.packets = {}
self.max = {}
def __iter__(self):
return self
def __next__(self):
while True:
line = self.fh.readline()
#print(f"line: {line}")
if line == '':
raise StopIteration
line = line.rstrip("\n")
if line == '':
continue
pid, seqid, maxseq, content = line.split(",")
pid = int(pid)
seqid = int(seqid)
maxseq = int(maxseq)
if pid not in self.packets:
self.packets[pid] = {}
self.max[pid] = maxseq
if seqid in self.packets[pid]:
raise Exception("pid arrived twice")
if maxseq != self.max[pid]:
raise Exception("maxseq changed")
self.packets[pid][seqid] = content
if len(self.packets[pid].keys()) == self.max[pid]:
content = list(map(lambda i: self.packets[pid][i+1], range(self.max[pid])))
del(self.max[pid])
del(self.packets[pid])
return content
The use:
import sys
from packets import Packets
if len(sys.argv) < 2:
exit(f"Usage: {sys.argv[0]} FILENAME")
for packet in Packets(sys.argv[1]):
print(packet)
The test to verify it
import os
import json
import pytest
from packets import Packets
root = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(root, 'packets.json')) as fh:
expected_results = json.load(fh)
@pytest.mark.parametrize('filename', ['packets.txt', 'packets1.txt', 'packets2.txt'])
def test_packetes(filename):
filepath = os.path.join(root, filename)
results = []
for packet in Packets(filepath):
results.append(packet)
assert results == expected_results
Expected result:
[["First of Twelve", "Second of Twelve", "Third of Twelve", "Fourth of Twelve", "Fifth of Twelve"], ["First of Nine", "Second of Nine", "Third of Nine", "Fourth of Nine"], ["First of Eleven", "Second of Eleven", "Third of Eleven"]]