diff --git a/seminar/ovvpfile.py b/seminar/ovvpfile.py new file mode 100644 index 00000000..59c56a24 --- /dev/null +++ b/seminar/ovvpfile.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +class OvvpFile(object): + def __init__(self): + self.headers = {} + self.columns = [] + self.rows = [] + + def to_lines(self): + # header + for hk in sorted(self.headers.keys()): + yield '%s\t%s\n' % (hk, self.headers[hk]) + yield '\n' + # columns + yield '\t'.join([c for c in self.columns]) + '\n' + # rows + for r in self.rows: + yield '\t'.join([r[c] for c in self.columns]) + '\n' + + def to_string(self): + return ''.join(self.to_lines()) + + def parse_from(self, source): + "Parse data from file, string or line iterator, overwriting self" + if isinstance(source, str) or isinstance(source, unicode): + return self.parse_from(source.split('\n')) + + it = iter(source) + + # header + self.headers = {} + for r in it: + if isinstance(r, str): + r = r.decode('utf8') + if r.endswith('\n'): + r = r[:-1] + assert isinstance(r, unicode) + if r == u"": + break + k, v = r.split(u'\t', 1) + self.headers[k] = v + + # columns + r = it.next() + self.columns = [cn for cn in r.split(u'\t') if cn != ""] + + # rows + self.rows = [] + for r in it: + if not r: + break + rtup = r.split(u'\t') + rdict = {} + for ci in range(len(self.columns)): + rdict[self.columns[ci]] = rtup[ci] + self.rows.append(rdict) + + + +def parse(source): + o = OvvpFile() + o.parse_from(source) + return o diff --git a/seminar/tests.py b/seminar/tests.py index ce61a1b7..4e2193ad 100644 --- a/seminar/tests.py +++ b/seminar/tests.py @@ -10,6 +10,7 @@ from django.core.management import call_command from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Soustredeni, Nastaveni from seminar.testutils import create_test_data +from seminar import ovvpfile class SeminarBasicTests(TestCase): def setUp(self): @@ -58,3 +59,17 @@ class SeminarBasicTests(TestCase): view = resolve(url) assert view + def test_ovvpfile(self): + filetext = "H1\ta\nH2\tb\tc\n\nx\ty\tz\n0\t1\t2\n3\t4\t5\n" + o = ovvpfile.parse(filetext) + assert len(o.headers) == 2 + assert o.headers['H2'] == 'b\tc' + + assert o.columns == ['x','y','z'] + assert len(o.rows) == 2 + assert o.rows[0]['z'] == '2' + + t = o.to_string() + assert t == filetext + +