def test_make_dictionary (self): d = make_object('Empty', {}) self.assertEqual(d.name, 'Empty') self.assertEqual(dict(d.value), {}) self.assertEqual(d.value, {}) self.assertEqual(len(d), 0) d = make_object('Text', {'Key1': 'Value1', 'Key2': 'Value2'}) self.assertEqual(d.name, 'Text') self.assertEqual(dict(d.value), {'Key1': 'Value1', 'Key2': 'Value2'}) self.assertEqual(d.value, {'Key1': 'Value1', 'Key2': 'Value2'}) self.assertEqual(len(d), 2) self.assertTrue('Key1' in d) self.assertTrue('Key2' in d) self.assertFalse('Key3' in d) self.assertEqual(d['Key1'], 'Value1') self.assertEqual(d['Key2'], 'Value2') self.assertRaises(KeyError, d.__getitem__, 'Key3') c = make_object('Name', d) self.assertEqual(c.name, 'Name') self.assertEqual(dict(c.value), {'Key1': u'Value1', 'Key2': u'Value2'}) self.assertEqual(c.value, {'Key1': 'Value1', 'Key2': 'Value2'}) self.assertRaises(TypeError, Dictionary, 'Name', 'Value') self.assertEqual(len(c), 2)
def entity_as_dictionary (self): res = make_object(self.meta.name, {}) for name, data in self: res.append(name, make_object(name, data)) return res
def test_eq (self): a = make_object('Name', 'Value') self.assertEqual(a, u'Value') self.assertNotEqual(a, u'Va1ue') b = make_object('Name', 'Value') c = make_object('Name', 'Va1ue') self.assertEqual(a, b) self.assertNotEqual(a, c)
def test_make_string (self): s = make_object('Name', u'Value') self.assertTrue(isinstance(s, String)) self.assertEqual(s.name, 'Name') self.assertEqual(s.value, u'Value') s = make_object('Name', 'Value') self.assertTrue(isinstance(s, String)) self.assertEqual(s.name, 'Name') self.assertEqual(s.value, u'Value')
def prepend (self, key, val, select_new=True): if key in self: raise KeyError(key) obj = make_object(key, val) selkey = (select_new or self._pos < 0) and key or self.selected if isinstance(obj, Dictionary) and (self.selected and not isinstance(self[self.selected], Dictionary)): for i in xrange(len(self) - 1, -2, -1): if i == -1 or not isinstance(self._values[i], Dictionary): self._values[i + 1:i + 1] = [obj] for j in xrange(i + 1, len(self)): self._keys[self._values[j].name] = j break elif not isinstance(obj, Dictionary) and (self.selected and isinstance(self[self.selected], Dictionary)): self._values[0:0] = [obj] for i in xrange(0, len(self)): self._keys[self._values[i].name] = i else: self._values[self._pos:self._pos] = [obj] for i in xrange(self._pos, len(self)): self._keys[self._values[i].name] = i self._pos = self._keys[selkey]
def read(self, fileobj, match=None): if not match: for line in fileobj: if line.strip(): match = self.match_re.match(line) if not match or not match.groups(): fileobj.seek(-len(line), os.SEEK_CUR) break name = match and match.group(1) or "" obj = make_object(name, {}) for line in fileobj: if not line.strip(): continue match = self.match_re.match(line) if match and match.groups(): if match.group(1)[: len(name)] != name or len(name) >= len(match.group(1)): # A section, but not a sub-section fileobj.seek(-len(line), os.SEEK_CUR) break obj.append(match.group(1), self.read(fileobj, match)) else: fileobj.seek(-len(line), os.SEEK_CUR) tobj = read_object(fileobj) obj.append(tobj.name, tobj) return obj
def test_read_object_empty_empty (self): obj = make_object('', {}) write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj, as_dictionary=True) self.assertEqual(obj, nobj)
def test_read_object_multiline (self): obj = make_object('Key2', 'MultiLine text\nSecondLine') write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj) self.assertEqual(obj, nobj)
def test_read_empty_empty (self): obj = make_object('', {}) write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = DictionaryObject().read(self.fileobj) self.assertEqual(obj, nobj)
def test_read_object_multiline_empty (self): obj = make_object('Key3', 'MultiLine\n\nw/ empty line') write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj) self.assertEqual(obj, nobj)
def test_read_object_empty (self): obj = make_object('Key0', '') StringObject().write(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj) self.assertEqual(obj, nobj)
def test_read_object_simple (self): obj = make_object('Key1', 'Simple Text') write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj) self.assertEqual(obj, nobj)
def test_write_key_nested (self): obj = make_object('Section', {}) obj.append('Key1', 'Value1') obj.append('SubSection', make_object('SubSection', {})) obj.append('Key2', 'Value2') DictionaryObject().write(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\n[Section]\n\nKey1: Value1\nKey2: Value2\n\n[Section.SubSection]\n\n') obj['SubSection'].append('SubKey1', 'SubValue1') self.fileobj.truncate(0) DictionaryObject().write(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\n[Section]\n\nKey1: Value1\nKey2: Value2\n\n[Section.SubSection]\n\n' 'SubKey1: SubValue1\n')
def test_read_object_key_empty (self): obj = make_object('Section', {}) write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj) self.assertEqual(obj, nobj)
def test_write_key_strings_simple (self): obj = make_object('Section', {}) obj.append('Key1', 'Value1') obj.append('Key2', 'Value2') obj.append('Key3', 'Value3') DictionaryObject().write(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\n[Section]\n\nKey1: Value1\nKey2: Value2\nKey3: Value3\n')
def test_write_object_empty_strings_simple (self): obj = make_object('', {}) obj.append('Key1', 'Value1') obj.append('Key2', 'Value2') obj.append('Key3', 'Value3') write_object(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\nKey1: Value1\nKey2: Value2\nKey3: Value3\n')
def test_read_key_strings_simple (self): obj = make_object('Section', {}) obj.append('Key1', 'Value1') obj.append('Key2', 'Value2') obj.append('Key3', 'Value3') write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = DictionaryObject().read(self.fileobj) self.assertEqual(obj, nobj)
def test_read_object_empty_strings_simple (self): obj = make_object('', {}) obj.append('Key1', 'Value1') obj.append('Key2', 'Value2') obj.append('Key3', 'Value3') write_object(obj, self.fileobj) self.fileobj.seek(0) nobj = read_object(self.fileobj, as_dictionary=True) self.assertEqual(obj, nobj)
def test_make_list (self): l = make_object('Empty', []) self.assertEqual(l.name, 'Empty') self.assertEqual(list(l.value), []) self.assertEqual(l.value, []) self.assertEqual(len(l), 0) l = make_object('Text', ['Value1', 'Value2']) self.assertEqual(l.name, 'Text') self.assertEqual(list(l.value), ['Value1', 'Value2']) self.assertEqual(l.value, ['Value1', 'Value2']) self.assertEqual(len(l), 2) self.assertTrue('Value1' in l) self.assertTrue('Value2' in l) self.assertFalse('Value3' in l) self.assertEqual(l[0], 'Value1') self.assertEqual(l[1], 'Value2') self.assertRaises(IndexError, l.__getitem__, 2) c = make_object('Name', l) self.assertEqual(c.name, 'Name') self.assertEqual(list(c.value), ['Value1', 'Value2']) self.assertEqual(c.value, ['Value1', 'Value2']) self.assertEqual(len(c), 2) self.assertTrue('Value1' in l) self.assertTrue('Value2' in l) self.assertFalse('Value3' in l) self.assertEqual(l[0], 'Value1') self.assertEqual(l[1], 'Value2') self.assertRaises(IndexError, l.__getitem__, 2)
def read(self, fileobj, match=None): if not match: line = fileobj.readline() match = self.match_re.match(line) if not match or not match.groups(): fileobj.seek(-len(line), os.SEEK_CUR) raise SyntaxError("'%s'" % line) name = match.group(1) value = match.group(3) cont_re = re.compile(r"^ (\.|.+)$") for line in fileobj: match = cont_re.match(line) if match and match.groups(): value += match.group(1) == "." and "\n" or ("\n" + match.group(1)) else: fileobj.seek(-len(line), os.SEEK_CUR) break return make_object(name, value)
def test_write_object_multiline (self): obj = make_object('Key2', 'MultiLine text\nSecondLine') write_object(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), 'Key2: MultiLine text\n SecondLine\n')
def test_write_empty_empty (self): obj = make_object('', {}) DictionaryObject().write(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\n')
def test_write_object_simple (self): obj = make_object('Key1', 'Simple Text') write_object(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), 'Key1: Simple Text\n')
def test_write_object_empty_empty (self): obj = make_object('', {}) write_object(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\n')
def test_write_object_empty (self): obj = make_object('Key0', '') StringObject().write(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), 'Key0: \n')
def test_write_object_multiline_empty (self): obj = make_object('Key3', 'MultiLine\n\nw/ empty line') write_object(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), 'Key3: MultiLine\n .\n w/ empty line\n')
def test_write_object_key_empty (self): obj = make_object('Section', {}) write_object(obj, self.fileobj) self.assertEqual(self.fileobj.getvalue(), '\n[Section]\n\n')
def replace (self, key, val, select_new=True): self._values[self._keys[key]] = make_object(key, val) if select_new: self._pos = self._keys[key]