#!/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
import sys

sys_path = sys.path
try:
  sys.path = [os.path.dirname(__file__)] + sys.path

  import wrapper_util

finally:
  sys.path = sys_path

wrapper_util.reject_old_python_versions((2, 5))




def get_dir_path(sibling):
  """Get a path to the directory of this script.

  By default, the canonical path (symlinks resolved) will be returned. In some
  environments the canonical directory is not sufficient because different
  parts of the SDK are referenced by symlinks, including this very module's
  file. In this case, the non-canonical path to this file's directory will be
  returned (i.e., the directory where the symlink lives, not the directory
  where it points).

  Args:
    sibling: Relative path to a sibling of this module file. Choose a sibling
    that is potentially symlinked into the parent directory.

  Returns:
    A directory name.

  Raises:
    ValueError: If no proper path could be determined.
  """
  return wrapper_util.get_dir_path(__file__, sibling)













DIR_PATH = get_dir_path(os.path.join('lib', 'ipaddr'))
_PATHS = wrapper_util.Paths(DIR_PATH)

SCRIPT_DIR = _PATHS.default_script_dir
GOOGLE_SQL_DIR = _PATHS.google_sql_dir

EXTRA_PATHS = _PATHS.v1_extra_paths

API_SERVER_EXTRA_PATHS = _PATHS.api_server_extra_paths

ENDPOINTSCFG_EXTRA_PATHS = _PATHS.endpointscfg_extra_paths


OAUTH_CLIENT_EXTRA_PATHS = _PATHS.oauth_client_extra_paths


GOOGLE_SQL_EXTRA_PATHS = _PATHS.google_sql_extra_paths




def fix_sys_path(extra_extra_paths=()):
  """Fix the sys.path to include our extra paths."""
  sys.path = EXTRA_PATHS + list(extra_extra_paths) + sys.path


def run_file(file_path, globals_):
  """Execute the given script with the passed-in globals.

  Args:
    file_path: the path to the wrapper for the given script. This will usually
      be a copy of this file.
    globals_: the global bindings to be used while executing the wrapped script.
  """
  script_name = os.path.basename(file_path)

  sys.path = (_PATHS.script_paths(script_name) +
              _PATHS.scrub_path(script_name, sys.path))







  if 'google' in sys.modules:
    del sys.modules['google']

  execfile(_PATHS.script_file(script_name), globals_)


if __name__ == '__main__':
  run_file(__file__, globals())
