diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2011-10-20 16:23:38 -0300 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2011-10-20 16:23:38 -0300 |
commit | 1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd (patch) | |
tree | d1ec29df3715680d3e6bfb70ce5330c458589600 /askbot/deployment | |
parent | 93928e09df2be2cd51cb4e14df4205e52b4e01fc (diff) | |
download | askbot-1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd.tar.gz askbot-1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd.tar.bz2 askbot-1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd.zip |
broken intermediate commit - refactoring the deployment function to make it more understandable
Diffstat (limited to 'askbot/deployment')
-rw-r--r-- | askbot/deployment/__init__.py | 288 | ||||
-rw-r--r-- | askbot/deployment/assertions.py | 3 | ||||
-rw-r--r-- | askbot/deployment/messages.py | 6 | ||||
-rw-r--r-- | askbot/deployment/path_utils.py | 87 |
4 files changed, 180 insertions, 204 deletions
diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index c20e168f..1ddf24ca 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -2,6 +2,7 @@ module for deploying askbot """ import os.path +import sys from optparse import OptionParser from askbot.utils import console from askbot.deployment import messages @@ -16,205 +17,124 @@ def askbot_setup(): """ parser = OptionParser(usage="%prog [options]") - parser.add_option("-v", "--verbose", - dest="verbosity", - type="int", - default=1, - help="verbosity level available values 0, 1, 2." - ) - - parser.add_option("-n", "--dir-name", - dest="name", - default=None, - help="Directory where you want to install." - ) - - parser.add_option("-d", "--db-name", - dest="database_name", - default=None, - help="The database name" - ) - - parser.add_option("-u", "--db-user", - dest="database_user", - default=None, - help="The database user" - ) - - parser.add_option("-p", "--db-password", - dest="database_password", - default=None, - help="the database password" - ) - - parser.add_option("--domain", - dest="domain_name", - default=None, - help="the domain name of the instance" - ) - - parser.add_option("--append-settings", - dest="local_settings", - default='', - help="Extra settings file to append custom settings" - ) - - parser.add_option("--force", - dest="force", - action='store_true', - help="Force overwrite settings.py file" - ) - + parser.add_option( + "-v", "--verbose", + dest = "verbosity", + type = "int", + default = 1, + help = "verbosity level available values 0, 1, 2." + ) + + parser.add_option( + "-n", "--dir-name", + dest = "dir_name", + default = None, + help = "Directory where you want to install." + ) + + parser.add_option( + "-d", "--db-name", + dest="database_name", + default=None, + help="The database name" + ) + + parser.add_option( + "-u", "--db-user", + dest="database_user", + default=None, + help="The database user" + ) + + parser.add_option( + "-p", "--db-password", + dest="database_password", + default=None, + help="the database password" + ) + + parser.add_option( + "--domain", + dest="domain_name", + default=None, + help="the domain name of the instance" + ) + + parser.add_option( + "--append-settings", + dest="local_settings", + default='', + help="Extra settings file to append custom settings" + ) + + parser.add_option( + "--force", + dest="force", + action='store_true', + help="Force overwrite settings.py file" + ) (options, args) = parser.parse_args() #ask if options.verbosity >= 1: print messages.DEPLOY_PREAMBLE - directory = options.name #directory where to put stuff + directory = path_utils.clean_directory(options.dir_name) + if options.verbosity >= 1 and directory is None: + print messages.CANT_INSTALL_INTO_FILE % {'path':directory} + sys.exit(1) + create_new = False #create new django project or not - where_to_deploy_msg = messages.WHERE_TO_DEPLOY - - if directory == None: - while directory is None: - where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT - directory = raw_input(where_to_deploy_msg + ' ') - directory = check_directory(directory, options) - if not directory: - continue - - if path_utils.can_create_path(directory): - if os.path.exists(directory): - if path_utils.path_is_clean_for_django(directory): - if path_utils.has_existing_django_project(directory): - message = messages.SHOULD_ADD_APP_HERE % \ - { - 'path': directory - } - should_add_app = console.choice_dialog( - message, - choices = ['yes','no'], - invalid_phrase = messages.INVALID_INPUT - ) - if should_add_app == 'yes': - assert(create_new == False) - if path_utils.dir_name_acceptable(directory): - break - else: - print messages.format_msg_bad_dir_name(directory) - directory = None - continue - else: - directory = None - continue - else: - assert(directory != None) - if path_utils.dir_name_acceptable(directory): - create_new = True - break - else: - print messages.format_msg_bad_dir_name(directory) - directory = None - continue - else: - print messages.format_msg_dir_unclean_django(directory) - directory = None - continue - else: - #creates dir - message = messages.format_msg_create(directory) - should_create_new = console.choice_dialog( - message, - choices = ['yes','no'], - invalid_phrase = messages.INVALID_INPUT - ) - if should_create_new == 'yes': - if path_utils.dir_name_acceptable(directory): - create_new = True - break - else: - print messages.format_msg_bad_dir_name(directory) - directory = None - continue - else: - directory = None - continue - else: - print messages.format_msg_dir_not_writable(directory) - directory = None - continue - - deploy_askbot(directory, create_new, options) - else: - directory = check_directory(directory, options) - create_new = True - if directory==None: - raise Exception("the directory you choosed is invalid") - #TODO middle steps! - if path_utils.can_create_path(directory): - if os.path.exists(directory): - if path_utils.path_is_clean_for_django(directory): - if path_utils.has_existing_django_project(directory): - if options.verbosity >= 1: - print "Integrating askbot to your current app" - create_new=False - else: - assert(directory != None) - if path_utils.dir_name_acceptable(directory): - pass - else: - raise Exception(messages.format_msg_bad_dir_name(directory)) - else: - raise Exception(messages.format_msg_dir_unclean_django(directory)) - else: - if path_utils.dir_name_acceptable(directory): - pass - else: - raise Exception(messages.format_msg_bad_dir_name(directory)) - else: - raise Exception(messages.format_msg_dir_not_writable(directory)) - - deploy_askbot(directory, create_new, options) + while directory is None: + directory = get_install_directory(force = options.force) + + deploy_askbot(directory, create_new_project, options) + #separated all the directory creation process to make it more useful -def deploy_askbot(directory, create_new, options): - '''function that copies the templates''' +def deploy_askbot(directory, create_new_project, options): + """function that creates django project files, + all the neccessary directories for askbot, + and the log file + """ + help_file = path_utils.get_path_to_help_file() - context = {'database_name': options.database_name, - 'database_password': options.database_password, - 'database_user': options.database_user, - 'domain_name': options.domain_name, - 'local_settings': options.local_settings, - } + context = { + 'database_name': options.database_name, + 'database_password': options.database_password, + 'database_user': options.database_user, + 'domain_name': options.domain_name, + 'local_settings': options.local_settings, + } for key in context.keys(): if context[key] == None: input_message = 'Please enter a value for %s:' % (key.replace('_', ' ')) new_value = raw_input(input_message) context[key] = new_value - if options.force: - create_new = options.force - - if create_new: - path_utils.create_path(directory) - path_utils.deploy_into(directory, new_project = True, - verbosity = options.verbosity, context = context) - if options.verbosity >= 1: - print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file} + path_utils.create_path(directory) + + create_new_project = False + if os.path.exists(directory): + if path_utils + + create_new_project or options.force + + path_utils.deploy_into( + directory, + new_project = create_new_project, + verbosity = options.verbosity, + context = context + ) + + if create_new_project: + print_message( + messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file}, + options.verbosity + ) else: - path_utils.deploy_into(directory, new_project = False, - verbosity = options.verbosity, context = context) - if options.verbosity >= 1: - print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} - -def check_directory(directory, options): - directory = os.path.normpath(directory) - directory = os.path.abspath(directory) - - if os.path.isfile(directory): - directory = None - if options.verbosity >= 1: - print messages.CANT_INSTALL_INTO_FILE % {'path':directory} - - return directory + print_message( + messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file}, + options.verbosity + ) diff --git a/askbot/deployment/assertions.py b/askbot/deployment/assertions.py index 0db62b84..d8dee828 100644 --- a/askbot/deployment/assertions.py +++ b/askbot/deployment/assertions.py @@ -12,7 +12,8 @@ def assert_package_compatibility(): """raises an exception if any known incompatibilities are found """ - (django_major, django_minor, django_micro) = package_utils.get_django_version() + (django_major, django_minor, django_micro) = \ + package_utils.get_django_version() if django_major < 1: raise DeploymentError('Django version < 1.0 is not supported by askbot') diff --git a/askbot/deployment/messages.py b/askbot/deployment/messages.py index 1569de6c..a108d927 100644 --- a/askbot/deployment/messages.py +++ b/askbot/deployment/messages.py @@ -9,9 +9,9 @@ Problems installing? -> please email admin@askbot.org To CANCEL - hit Ctr-C at any time""" -WHERE_TO_DEPLOY = 'Where to deploy (in which directory)?' +WHERE_TO_DEPLOY = 'In which directory to deploy the forum?' -WHERE_TO_DEPLOY_QUIT = 'Where deploy forum (directory)? (Ctrl-C to quit)' +WHERE_TO_DEPLOY_QUIT = 'Where deploy the forum (directory)? Ctrl-C to quit.' CANT_INSTALL_INTO_FILE = '%(path)s is a file\ncannot install there' @@ -78,7 +78,7 @@ def format_msg_dir_unclean_django(directory): directories contains a django project so that users don't create nested projects """ - parent_django_dir = path_utils.find_parent_dir_with_django(directory) + return path_utils.find_parent_dir_with_django(directory) def format_msg_bad_dir_name(directory): """directory name must be bad - i.e. taken by other python module diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 676f8bf8..806fa80c 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -13,6 +13,7 @@ import shutil import imp from askbot.deployment.template_loader import SettingsTemplate + def split_at_break_point(directory): """splits directory path into two pieces first that exists and secon - that does not @@ -29,6 +30,17 @@ def split_at_break_point(directory): tail_bits.insert(0, tail) return head, os.path.join(*tail_bits) +def clean_directory(directory): + """Returns normalized absolute path to the directory + regardless of whether it exists or not + or None - if the path is a file""" + directory = os.path.normpath(directory) + directory = os.path.abspath(directory) + + if os.path.isfile(directory): + return None + return directory + def directory_is_writable(directory): """returns True if directory exists @@ -66,7 +78,8 @@ def has_existing_django_project(directory): """returns True is any of the .py files in a given directory imports anything from django """ - file_list = glob.glob(directory + '*.py') + directory = os.path.normpath(directory) + file_list = glob.glob(directory + os.path.sep + '*.py') for file_name in file_list: py_file = open(file_name) for line in py_file: @@ -124,10 +137,10 @@ def get_path_to_help_file(): """returns path to the main plain text help file""" return os.path.join(SOURCE_DIR, 'doc', 'INSTALL') -def deploy_into(directory, new_project = None, verbosity=1, context=None): +def deploy_into(directory, new_project = None, verbosity = 1, context = None): """will copy necessary files into the directory """ - assert(new_project is not None) + assert(isinstance(new_project, bool)) if new_project: copy_files = ('__init__.py', 'manage.py', 'urls.py') blank_files = ('__init__.py', 'manage.py') @@ -143,11 +156,11 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): #overwrite urls.py shutil.copy(src, directory) else: - if verbosity >=1: + if verbosity >= 1: print '* %s' % file_name, print "- you already have one, please add contents of %s" % src else: - if verbosity >=1: + if verbosity >= 1: print '* %s ' % file_name shutil.copy(src, directory) #copy log directory @@ -157,14 +170,14 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): touch(os.path.join(log_dir, 'askbot.log')) #creating settings file from template - if verbosity>=1: + if verbosity >= 1: print "Creating settings file" settings_contents = SettingsTemplate(context).render() settings_path = os.path.join(directory, 'settings.py') - if os.path.exists(settings_path) and new_project==False: - if verbosity>=1: + if os.path.exists(settings_path) and new_project == False: + if verbosity >= 1: print "* you already have a settings file please merge the contents" - else: + elif new_project == True: settings_file = open(settings_path, 'w+') settings_file.write(settings_contents) #Grab the file! @@ -174,10 +187,10 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): settings_file.write(local_settings) settings_file.close() - if verbosity>=1: + if verbosity >= 1: print "settings file created" - if verbosity >=1: + if verbosity >= 1: print '' app_dir = os.path.join(directory, 'askbot') @@ -188,21 +201,21 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): dst = os.path.join(app_dir, dir_name) if os.path.abspath(src) != os.path.abspath(dst): if dirs_copied == 0: - if verbosity >=1: + if verbosity >= 1: print 'copying directories: ', - if verbosity >=1: + if verbosity >= 1: print '* ' + dir_name if os.path.exists(dst): if os.path.isdir(dst): - if verbosity >=1: + if verbosity >= 1: print 'Directory %s not empty - skipped' % dst else: - if verbosity >=1: + if verbosity >= 1: print 'File %s already exists - skipped' % dst continue shutil.copytree(src, dst) dirs_copied += 1 - if verbosity >=1: + if verbosity >= 1: print '' def dir_name_acceptable(directory): @@ -213,3 +226,45 @@ def dir_name_acceptable(directory): return False except ImportError: return True + +def get_install_directory(force = False): + """returns a directory where a new django app/project + can be installed. + If ``force`` is ``True`` - will permit + using a directory with an existing django project. + """ + + where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT + directory = raw_input(where_to_deploy_msg + ' ') + directory = clean_directory(directory) + + if directory is None: + return None + + if can_create_path(directory) == False: + print messages.format_msg_dir_not_writable(directory) + return None + + if os.path.exists(directory): + if path_is_clean_for_django(directory): + if has_existing_django_project(directory): + if force == False: + print messages.CANNOT_OVERWRITE_EXISTING_DJANGO_PROJECT + return None + else: + print messages.format_msg_dir_unclean_django(directory) + return None + elif force == False: + message = messages.format_msg_create(directory) + should_create_new = console.choice_dialog( + message, + choices = ['yes','no'], + invalid_phrase = messages.INVALID_INPUT + ) + if should_create_new == 'no': + return None + + if not dir_name_acceptable(directory): + print messages.format_msg_bad_dir_name(directory) + return None + |