def schema_files(logger, schema_dir): task = listdir(schema_dir).fmap(matching_schema_files) msgs = lambda files: ([ "no local schema migrations found" if len(files)==0 else ( "total local schema migrations: %d" % len(files) ) ]) return logresult_info(msgs,logger,task)
def db_current_version(logger, dbcmd, table="_version_" ): sql = ( """ SELECT version FROM `%s` WHERE id = (SELECT MAX(id) FROM `%s` WHERE revert=0); """ ) % (table, table) task = (tempfile(sql) >> db_getvalue(dbcmd,'version')) >> ( reject_unless(NoValueFoundError('version')) ) msgs = lambda v: ["database version: %s" % v] return logresult_info(msgs, logger, task)
def schema_version_undo_files(logger, dbcmd, schema_dir, table="_version_"): matcher = flip(applyf)(matching_schema_undo_files_for_version) versiontask = db_current_version(logger, dbcmd, table) listtask = schema_undo_files(logger, schema_dir) task = Task.all([ versiontask, listtask ]).fmap( matcher ) msgs = lambda files: ([ "no undo migrations found, add new schema migration file(s) to revert changes" if len(files)==0 else ( "undo migration found: %s" % files[0] if len(files)==1 else ( "undo migrations found: %d\n%s" % (len(files), "\n".join(files)) ) ) ]) return logresult_info(msgs,logger,task)
def check(logger, dbcmd, schema_dir, table="_version_" ): matcher = flip(applyf)(split_schema_files_at_version) snd = lambda (_,x): x task = Task.all([ db_current_version(logger,dbcmd,table), schema_files(logger,schema_dir) ]).fmap( matcher ) msgs = lambda (previous,pending): ( [ "no schema migrations applied" if len(previous) == 0 else ( "schema migrations applied: %d\nlatest: %s" % ( len(previous), previous[-1] ) ), "no pending schema migrations found" if len(pending) == 0 else ( "pending schema migrations found: %d\n%s" % ( len(pending), "\n".join([os.path.basename(f) for f in pending]) ) ) ] ) return logtask("Checking current state", logger, logresult_info(msgs, logger, task).fmap(snd) )