Last active
October 12, 2015 20:48
-
-
Save pfdevmuller/4085480 to your computer and use it in GitHub Desktop.
Python script that finds and runs other scripts, passing them each an open Database connection.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import glob | |
import sys | |
import os | |
import sqlite3 as sqlite | |
def LoadScripts(scriptFolder): | |
''' Returns a list of module references ''' | |
# Find Script Files: | |
scriptFiles = glob.glob(os.path.join(scriptFolder, "Script*.py")) | |
print "Found %d Script Files" % (len(scriptFiles)) | |
# Load scripts: | |
loadedScripts = [] | |
for scriptFile in scriptFiles: | |
try: | |
# Get full module name: | |
scriptName = os.path.basename(scriptFile) | |
scriptName = os.path.splitext(scriptName)[0] | |
folderName = os.path.basename(scriptFolder) | |
fullModuleName = "%s.%s" % (folderName, scriptName) | |
# Import Script: | |
script_module = __import__(fullModuleName, fromlist=["fullModuleName"]) | |
# Store reference to Script: | |
loadedScripts.append(script_module) | |
except Exception, e: | |
print "Something went wrong while loading script file \'%s\'" % scriptFile | |
print e | |
return loadedScripts | |
def RunScripts(databaseFilename, loadedScripts): | |
try: | |
# Open DB: | |
connection = sqlite.connect(databaseFilename) | |
# Keep a list of completed scripts so scripts can test if they are ready to run: | |
namesOfCompletedScripts = [] | |
success = True | |
# Keep passing over list until everything has been run: | |
while (len(namesOfCompletedScripts) < len(loadedScripts)): | |
nothingExecutedOnThisPass = True | |
# Iterate over scripts: | |
for script in loadedScripts: | |
try: | |
# Check if this script has been run or not: | |
if (script.Name not in namesOfCompletedScripts): | |
# Ask script if it is ready to run - | |
# - give it a list of completed scripts: | |
if (script.CanRun(connection, namesOfCompletedScripts)): | |
# Run script: | |
script.Run(connection) | |
namesOfCompletedScripts.append(script.Name) | |
nothingExecutedOnThisPass = False | |
else: | |
print "\n%s not ready to run" % script.Name | |
except Exception, e: | |
print "Something went wrong while running script %s" % script.Name | |
print e | |
success = False | |
if (nothingExecutedOnThisPass): | |
# If nothing executed on this pass, we're stuck - | |
# - the remaining scripts won't run | |
break | |
print "\nThe following scripts were successfully run:" | |
print namesOfCompletedScripts | |
if (len(namesOfCompletedScripts) < len(loadedScripts)): | |
print "Some scripts failed:" | |
for script in loadedScripts: | |
if (script.Name not in namesOfCompletedScripts): | |
print "\t" + script.Name | |
except Exception, e: | |
print "Something went wrong while applying scripts to DB" | |
print e | |
finally: | |
# Close DB: | |
connection.close() | |
if __name__ == "__main__": | |
if (len(sys.argv) != 3): | |
print "\n\tRequires two arguments:" | |
print "\n\t\tRunDatabaseScripts.py {databasefilename} {scriptfolder}\n\n" | |
sys.exit() | |
databaseFilename = sys.argv[1] | |
scriptFolder = sys.argv[2] | |
# Load Scripts: | |
loadedScripts = LoadScripts(scriptFolder) | |
RunScripts(databaseFilename, loadedScripts) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment