Commit 867e7b56 authored by carlosperate's avatar carlosperate

Start script: improve app localiser and cli args.

parent 8e942f9f
......@@ -15,7 +15,7 @@ PORT = 8000
def start_server(document_root):
""" Start the server with the document root indicated by argument """
print('\nSetting HTTP Server Document Root to: \n\t' + document_root + "\n")
print('Setting HTTP Server Document Root to: \n\t' + document_root + "\n")
os.chdir(document_root)
server_address = (ADDRESS, PORT)
server = BaseHTTPServer.HTTPServer(
......
......@@ -11,6 +11,7 @@ from __future__ import unicode_literals, absolute_import
import os
import re
import sys
import struct
import getopt
import platform
import threading
......@@ -25,99 +26,149 @@ def open_browser(open_file):
Start a browser in a separate thread after waiting for half a second.
"""
def _open_browser():
webbrowser.open('http://localhost:%s/%s' %
(ardublocklyserver.server.PORT, open_file))
webbrowser.get().open('http://localhost:%s/%s' %
(ardublocklyserver.server.PORT, open_file))
thread = threading.Timer(0.5, _open_browser)
thread.start()
def parsing_args(argv):
def find_ardublockly_dir(search_path):
"""
Navigates within each node of a given path and tries to find the Ardublockly
project root directory. It assumes that the project root with have an folder
name ardublockly with an index.html file inside.
This function is required because this script can end up in executable form
in different locations of the project folder, and a literal relative path
should not be assumed.
:param search_path: Path in which to find the Ardublockly root project
folder.
:return: Path to the Ardublockly root folder.
If not found returns None.
"""
path_to_navigate = os.path.normpath(search_path)
# Navigate through each path node starting at the bottom until there are
# no folders left
while path_to_navigate:
# Check if file /ardublokly/index.html exists within current path
if os.path.isfile(
os.path.join(path_to_navigate, 'ardublockly', 'index.html')):
# Found the right folder, return it
return path_to_navigate
path_to_navigate = os.path.dirname(path_to_navigate)
# The right folder wasn't found, so return input path
return None
def parsing_cl_args():
"""
Processes the command line arguments. Arguments supported:
-h / --help
-s / --serverroot <working directory>
:return: dictionary with available options(keys) and value(value)
:return: Dictionary with available options(keys) and value(value).
"""
option_dict = {}
try:
opts, args = getopt.getopt(argv, "hs:", ["help", "serverroot="])
except getopt.GetoptError as e:
print('There was a problem parsing the command line arguments:')
print('\t%s' % e)
sys.exit(1)
# Set option defaults
launch_browser = True
server_root = None
find_project_root = False
for opt, arg in opts:
if opt in ("-h", "--help"):
print('Include a server working directory using the flag:')
print('\t -s <folder>')
sys.exit(0)
if opt in ("-s", "--serverroot"):
# Windows only issue: In BlocklyRequestHandler, if chdir is fed
# an 'incorrect' path like 'C:' instead of 'C:\' or C:/' it
# fails silently maintaining the current working directory.
# Use regular expressions to catch this corner case.
if re.match("^[a-zA-Z]:$", arg):
print('The windows drive letter needs to end in a slash, ' +
'eg. %s\\' % arg)
sys.exit(1)
# Check if the value is a valid directory
if os.path.isdir(arg):
option_dict['serverroot'] = arg
print ('Parsed "' + opt + '" flag with "' + arg + '" value.')
if len(sys.argv) == 1:
print("No command line arguments found.")
else:
try:
opts, args = getopt.getopt(
sys.argv[1:],
'hs:bf',
['help', 'serverroot=', 'nobrowser', 'findprojectroot'])
except getopt.GetoptError as e:
print('There was a problem parsing the command line arguments:')
print('\t%s' % e)
sys.exit(1)
for opt, arg in opts:
if opt in ('-h', '--help'):
print('Help flag parsed, these are the current options:\n')
print('\t-s <folder>\tSets the server working directory.')
print('\t-b\t\tSuppresses opening the local browser.')
sys.exit(0)
if opt in ('-s', '--serverroot'):
# Windows only issue: In BlocklyRequestHandler, if chdir is fed
# an 'incorrect' path like 'C:' instead of 'C:\' or C:/' it
# fails silently maintaining the current working directory.
# Use regular expressions to catch this corner case.
if re.match("^[a-zA-Z]:$", arg):
print('The windows drive letter needs to end in a slash, ' +
'eg. %s\\' % arg)
sys.exit(1)
# Check if the value is a valid directory
arg = os.path.normpath(arg)
if os.path.isdir(arg):
server_root = arg
print ('Parsed "%s" flag with "%s" value.' % (opt, arg))
else:
print('Invalid directory "' + arg + '".')
sys.exit(1)
elif opt in ('-b', '--nobrowser'):
launch_browser = False
print ('Parsed "%s" flag. No browser will be opened.' % opt)
elif opt in ('-f', '--findprojectroot'):
find_project_root = True
print ('Parsed "%s" flag. The ardublockly project root will be '
'set as the server root directory.' % opt)
else:
print('Invalid directory "' + arg + '".')
sys.exit(1)
else:
print('Flag ' + opt + ' not recognised.')
return option_dict
print('Flag ' + opt + ' not recognised.')
return find_project_root, launch_browser, server_root
def main(argv):
def main():
"""
Initialises the Settings singleton and starts the HTTP Server
Initialises the Settings singleton, resolves paths, and starts the server.
"""
print('Running Python version %s' % platform.python_version())
# Checking command line arguments
if len(argv) > 0:
print("\n======= Parsing Command line arguments =======")
arguments = parsing_args(argv)
if 'serverroot' in arguments:
# Overwrite server working directory if valid
server_root = arguments['serverroot']
# Loading the settings
print("\n======= Loading Settings =======")
print('Running Python %s (%s bit) on %s' % (platform.python_version(),
(struct.calcsize('P') * 8), platform.platform()))
print('\n\n======= Parsing Command line arguments =======\n')
find_project_root, launch_browser, server_root = parsing_cl_args()
print('\n\n======= Loading Settings =======')
ardublocklyserver.compilersettings.ServerCompilerSettings()
# Loading the server with the argument working root directory, or by default
# with the parent folder of where this script is executed, done to be able
# to find the closure lib directory on the same level as the project folder
print("\n======= Starting Server =======")
this_file_parent_dir =\
os.path.dirname(os.path.realpath(sys.argv[0]))
try:
server_root
except NameError:
server_root = this_file_parent_dir
# Opening the browser to the web-app
paths = [server_root, this_file_parent_dir]
common_path = os.path.commonprefix(paths)
if not common_path:
print('The server working directory and Ardublockly project need to ' +
'be in the same root directory.!' +
'The server root also needs to be at least one directory up ' +
'from the Ardublockly folder!')
print('\n\n======= Resolving server and project paths =======\n')
# Based on command line options, set the server root to the ardublockly
# project root directory, a directory specified in the arguments, or by
# default to the project root directory.
this_file_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
ardublockly_root_dir = find_ardublockly_dir(this_file_dir)
if ardublockly_root_dir is None:
print('The Ardublockly project root folder could not be found within '
'the %s directory !' % this_file_dir)
sys.exit(1)
relative_path = [os.path.relpath(this_file_parent_dir, common_path)]
app_index = os.path.normpath(os.path.join(
relative_path[0], 'ardublockly'))
#print('Root & script parent: %s\nCommon & relative path: %s; %s\nIndex: %s'
# % (paths, common_path, relative_path, app_index))
open_browser(app_index)
print("Ardublockly root directory: %s" % ardublockly_root_dir)
if find_project_root is True or server_root is None:
server_root = ardublockly_root_dir
else:
# Arguments have set a server root, and to not find ardublockly dir
if not os.path.commonprefix([server_root, ardublockly_root_dir]):
print('The Ardublockly project folder needs to be accessible from '
'the server root directory !')
print("Selected server root: %s" % server_root)
if launch_browser:
# Find the relative path from server root to ardublockly html
ardublockly_html_dir = os.path.join(ardublockly_root_dir, 'ardublockly')
relative_path = os.path.relpath(ardublockly_html_dir, server_root)
print("Ardublockly page relative path from server root: %s" %
relative_path)
open_browser(relative_path)
print('\n\n======= Starting Server =======\n')
ardublocklyserver.server.start_server(server_root)
if __name__ == "__main__":
main(sys.argv[1:])
if __name__ == '__main__':
main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment