#!/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())