Source code for pankus.taurus.data_journal
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pankus import __version__, __authors__
from .sqlite_database import SQLiteDatabase
import time
import csv
from .utils import init_kwargs_as_parameters
from functools import wraps
[docs]class DataJournal(SQLiteDatabase):
def __init__(self,use_data_stash=False,parent_action_uid=None,**kwargs):
super().__init__(**kwargs)
self.parent_action_uid=parent_action_uid
self.do('datajournal/create_model_log') if not self.table_exists('model_log') else False
self.do('datajournal/create_data_stash') if not self.table_exists('data_stash') else False
@staticmethod
def logged_function(function):
@wraps(function)
def wrapper(self,*args,**kwargs):
parameter_list=[str(argg) for argg in args]
parameter_list.extend([str(key)+'='+str(kwargs[key]) for key in list(kwargs.keys())])
action=str(function.__name__)+"("+", ".join(parameter_list)+")"
version=__version__
action_uid=self.get_action_uid()
datetime=time.time()
out=function(self,*args, **kwargs)
self.do('datajournal/insert_model_log',{
'action_uid':action_uid,
'action':action,
'datetime':datetime,
'p_action_uid':self.parent_action_uid,
'version':version})
self.parent_action_uid=action_uid
return out
return wrapper
def get_action_uid(self):
return self.one('datajournal/get_next_action_uid')[0]
@staticmethod
def data_stash(table_name):
def data_deco(function):
@wraps(function)
def wrapper(self,*args,use_data_stash=False,**kwargs):
out=function(self,*args,use_data_stash=use_data_stash,**kwargs)
if use_data_stash:
assert ";" not in table_name
assert len(table_name)<30
cursor=self.db_connection.execute("SELECT * FROM "+table_name)
names = [description[0] for description in cursor.description]
header=','.join(names)
data=[str(row)[1:-1] for row in cursor]
csv=header+"\n"+"\n".join(data)
self.do('datajournal/insert_data_stash',{
'action_uid':self.parent_action_uid,
'table_name':table_name,
'csv':csv})
return out
return wrapper
return data_deco
@staticmethod
def log_and_stash(*args_general):
def real_decorator(function):
@wraps(function)
def wrapper(self,*args,use_data_stash=False,**kwargs):
function2=DataJournal.logged_function(function)
if use_data_stash:
for arg in args_general:
function2=(DataJournal.data_stash(arg))(function2)
return function2(self,*args,use_data_stash=use_data_stash,**kwargs)
return wrapper
return real_decorator