Source code for Mind.Knowledge
"""
Part of library for data saving.
"""
[docs]def data_bytes(data):
"""
Function that data(number, string...) converts to bytes:
0 - numbers(integers and floats),
1 - strings,
2 - floating point,
3 - lists beginning,
4 - lists ending.*
"""
final = bytearray()
if type(data) == str:
final.append(1) # starting number of strings
for l in data:
final.append(ord(l))
final.append(1) # ending number of strings
elif type(data) == int:
final.append(0) # starting number of numbers
for x in range(int(data / 250)):
final.append(255)
data -= 250
final.append(data + 5)
final.append(0) # ending number of numbers
elif type(data) == float:
final.append(0) # starting number of numbers
for x in range(int(data / 250)):
final.append(255)
data -= 250
final.append(int(data) + 5)
data -= int(data)
final.append(2) # floating point (.) number
for x in range(int(round(data, 3) * 1000 / 250)):
final.append(255)
data -= 0.250
final.append(int(data * 1000) + 5)
final.append(0) # ending number of strings
elif type(data) == list:
final.append(3) # starting number of lists
for x in data:
for bit in data_bytes(x):
final.append(bit)
final.append(4) # ending number of lists
return final
[docs]class Knowledge:
"""Class for all data in program.
"""
def __init__(self, filename):
self.data = {}
self.filename = filename + '.knw'
self.save = bytearray()
def __repr__(self):
self.ret = ''
for x in self.data:
self.ret += str(x)
self.ret += ' : '
self.ret += str(self.data[x])
self.ret += '\n'
return self.ret[:-1] # so last \n is deleted
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
[docs] def save_data(self):
"""Saves all data.
"""
for thing in self.data:
for bit in data_bytes(thing):
self.save.append(bit)
for bit in data_bytes(self.data[thing]):
self.save.append(bit)
with open(self.filename, 'wb') as output:
output.write(self.save)
[docs]def bytes_data(binary):
"""Function that bytes converts to data(numbers, strings...).*
"""
thing = None
decimal = False
ret = None
nested = 0
for x in binary:
if thing == 'integer':
if x == 0:
thing = None
decimal = False
yield ret
ret = None
elif x == 2:
decimal = True
else:
if decimal:
ret += x / 1000 + 0.005
else:
ret += x - 5
elif thing == 'string':
if x == 1:
thing = None
yield ret
ret = None
else:
ret += chr(x)
elif thing == 'list':
if x == 3:
nested += 1
if x == 4:
if nested:
nested -= 1
ret.append(x)
else:
thing = None
fin = []
for b in bytes_data(ret):
fin.append(b)
yield fin
ret = None
else:
ret.append(x)
else:
if x == 0:
thing = 'integer'
ret = 0
elif x == 1:
thing = 'string'
ret = ''
elif x == 3:
thing = 'list'
ret = bytearray()
[docs]def load(filename):
"""Function that loads saved data and returns Knowledge object.
"""
with open(filename + '.knw', 'rb') as infile:
a = bytearray(infile.read())
res = Knowledge(filename)
state = 'key'
key = None
data = None
for x in bytes_data(a):
if state == 'key':
key = x
state = 'data'
else:
data = x
state = 'key'
res[key] = data
key = None
data = None
return res