Support a testy pro ovvp-format dat
This commit is contained in:
		
							parent
							
								
									f33be6c2e9
								
							
						
					
					
						commit
						6947131a03
					
				
					 2 changed files with 78 additions and 0 deletions
				
			
		
							
								
								
									
										63
									
								
								seminar/ovvpfile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								seminar/ovvpfile.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
|  | @ -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 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tomas Gavenciak
						Tomas Gavenciak