#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Convenience wrapper for starting an appengine tool."""
import os,sys
_POSSIBLE_GAE_LOCATIONS = ['/home/sergey/Envs/classes/google_appengine',
'/home/singer/.virtualenvs/classes//google_appengine',
'/var/www/classes-root/test/google_appengine',
'/usr/local/google_appengine',
'/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine',
'c:\\Program Files (x86)\\Google\\google_appengine\\'
]
DJANGO_VERSIONED_DIRNAME = 'django-1.4'
def find_gae_path():
paths = _POSSIBLE_GAE_LOCATIONS
SDK_PATH = None
for sdk_path in paths:
sdk_path = os.path.realpath(sdk_path)
if os.path.exists(sdk_path):
SDK_PATH = sdk_path
break
if SDK_PATH is None:
# The SDK could not be found in any known location.
sys.stderr.write('The Google App Engine SDK could not be found!\n'
'Visit http://code.google.com/p/app-engine-patch/'
' for installation instructions.\n')
sys.exit(1)
return SDK_PATH
GAE_PATH = find_gae_path()
def get_gae_dir_path(sibling):
dir_paths = [os.path.abspath(os.path.realpath(GAE_PATH)),
os.path.abspath(GAE_PATH)]
for dir_path in dir_paths:
sibling_path = os.path.join(dir_path, sibling)
if os.path.exists(sibling_path):
return dir_path
raise ValueError('Could not determine directory that contains both, this '
'file and %s.' % sibling)
DIR_PATH = get_gae_dir_path(os.path.join('lib', 'ipaddr'))
PATHS = [ #minimum required additional sys paths we need gae+django to start
DIR_PATH,
GAE_PATH,
os.path.join(DIR_PATH, 'lib', DJANGO_VERSIONED_DIRNAME),
os.path.join(DIR_PATH, 'lib', 'yaml', 'lib'),
os.path.join(DIR_PATH, 'lib', 'webob_0_9'),
]
EXTRA_PATHS = [ #this may differ from command to command
# os.path.join(DIR_PATH, 'lib'),
os.path.join(DIR_PATH, 'lib', 'antlr3'),
os.path.join(DIR_PATH, 'lib', 'fancy_urllib'),
os.path.join(DIR_PATH, 'lib', 'ipaddr'),
os.path.join(DIR_PATH, 'lib', 'jinja2-2.6'),
os.path.join(DIR_PATH, 'lib', 'protorpc'),
os.path.join(DIR_PATH, 'lib', 'PyAMF'),
os.path.join(DIR_PATH, 'lib', 'markupsafe'),
os.path.join(DIR_PATH, 'lib', 'webapp2-2.5.2'),
os.path.join(DIR_PATH, 'lib', 'google.appengine._internal.graphy'),
os.path.join(DIR_PATH, 'lib', 'simplejson'),
os.path.join(DIR_PATH, 'lib', 'concurrent'),
os.path.join(DIR_PATH, 'lib', 'cherrypy'),
]
def add_required_paths():
sys.path.extend(PATHS[:])
def add_extra_paths(extra_extra_paths=()):
"""Fix the sys.path to include our extra paths."""
extra_paths = EXTRA_PATHS[:]
extra_paths.extend(extra_extra_paths)
sys.path = extra_paths + sys.path
_get_dir_path = get_gae_dir_path
SCRIPT_DIR = os.path.join(DIR_PATH, 'google', 'appengine', 'tools')
DEVAPPSERVER2_DIR = os.path.join(
DIR_PATH, 'google', 'appengine', 'tools', 'devappserver2')
PYTHON_RUNTIME_DIR = os.path.join(
DIR_PATH, 'google', 'appengine', 'tools', 'devappserver2', 'python')
# EXTRA_PATHS = [
# DIR_PATH,
# os.path.join(DIR_PATH, 'lib', 'concurrent'),
# os.path.join(DIR_PATH, 'lib', 'cherrypy'),
# os.path.join(DIR_PATH, 'lib', 'fancy_urllib'),
# os.path.join(DIR_PATH, 'lib', 'yaml-3.10'),
# ]
DEVAPPSERVER2_PATHS = [
os.path.join(DIR_PATH, 'lib', 'antlr3'),
os.path.join(DIR_PATH, 'lib', 'argparse'),
os.path.join(DIR_PATH, 'lib', 'ipaddr'),
os.path.join(DIR_PATH, 'lib', 'jinja2-2.6'),
os.path.join(DIR_PATH, 'lib', 'webob-1.2.3'),
os.path.join(DIR_PATH, 'lib', 'webapp2-2.5.1'),
]
SCRIPT_EXCEPTIONS = {
'_python_runtime.py': 'runtime.py',
}
SCRIPT_DIR_EXCEPTIONS = {
'devappserver2.py': DEVAPPSERVER2_DIR,
'_python_runtime.py': PYTHON_RUNTIME_DIR,
}
PATH_EXCEPTIONS = {
'devappserver2.py': DEVAPPSERVER2_PATHS
}
def fix_sys_path(extra_extra_paths=()):
"""Fix the sys.path to include our extra paths."""
add_required_paths()
extra_paths = EXTRA_PATHS[:]
extra_paths.extend(extra_extra_paths)
sys.path = extra_paths + sys.path
#
_DIR_PATH = _get_dir_path(os.path.join('lib', 'ipaddr'))
_SCRIPT_DIR = os.path.join(_DIR_PATH, 'google', 'appengine', 'tools')
_DEVAPPSERVER2_DIR = os.path.join(
_DIR_PATH, 'google', 'appengine', 'tools', 'devappserver2')
_PYTHON_RUNTIME_DIR = os.path.join(
_DIR_PATH, 'google', 'appengine', 'tools', 'devappserver2', 'python')
_STUB_DEPENDENCIES = [
os.path.join(_DIR_PATH, 'lib', 'antlr3'),
os.path.join(_DIR_PATH, 'lib', 'fancy_urllib'),
os.path.join(_DIR_PATH, 'lib', 'ipaddr'),
os.path.join(_DIR_PATH, 'lib', 'yaml-3.10'),
]
_DEVAPPSERVER2_PATHS = _STUB_DEPENDENCIES + [
_DIR_PATH,
os.path.join(_DIR_PATH, 'lib', 'concurrent'),
os.path.join(_DIR_PATH, 'lib', 'cherrypy'),
os.path.join(_DIR_PATH, 'lib', 'jinja2-2.6'),
os.path.join(_DIR_PATH, 'lib', 'webob-1.2.3'),
os.path.join(_DIR_PATH, 'lib', 'webapp2-2.5.1'),
]
_PYTHON_RUNTIME_PATHS = [
_DIR_PATH,
os.path.join(_DIR_PATH, 'lib', 'concurrent'),
os.path.join(_DIR_PATH, 'lib', 'cherrypy'),
os.path.join(_DIR_PATH, 'lib', 'fancy_urllib'),
os.path.join(_DIR_PATH, 'lib', 'protorpc'),
os.path.join(_DIR_PATH, 'lib', 'yaml-3.10'),
]
_BOOTSTAP_NAME_TO_REAL_NAME = {
'dev_appserver.py': 'devappserver2.py',
'_python_runtime.py': 'runtime.py',
}
_SCRIPT_TO_DIR = {
'dev_appserver.py': _DEVAPPSERVER2_DIR,
'_python_runtime.py': _PYTHON_RUNTIME_DIR,
}
_SYS_PATH_ADDITIONS = {
'dev_appserver.py': _DEVAPPSERVER2_PATHS,
'_python_runtime.py': _PYTHON_RUNTIME_PATHS,
}
def fix_sys_path(extra_extra_paths=()):
"""Fix the sys.path to include our extra paths.
fix_sys_path should be called before running testbed-based unit tests so that
third-party modules are correctly added to sys.path.
"""
sys.path[1:1] = EXTRA_PATHS
def _run_file(file_path, globals_, script_dir=_SCRIPT_DIR):
"""Execute the file at the specified path with the passed-in globals."""
script_name = os.path.basename(file_path)
sys.path = _SYS_PATH_ADDITIONS[script_name] + sys.path
if 'google' in sys.modules:
del sys.modules['google']
script_dir = _SCRIPT_TO_DIR.get(script_name, script_dir)
script_name = _BOOTSTAP_NAME_TO_REAL_NAME.get(script_name, script_name)
script_path = os.path.join(script_dir, script_name)
execfile(script_path, globals_)
if __name__ == '__main__':
_run_file(__file__, globals())