#!/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.
#

"""Stub replacement for Python's imp module."""


import os
import sys


PY_SOURCE, PY_COMPILED, C_EXTENSION = 1, 2, 3
PKG_DIRECTORY, C_BUILTIN, PY_FROZEN = 5, 6, 7


def get_magic():
  """Return the magic string used to recognize byte-compiled code files."""
  return '\xb3\xf2\r\n'


_PY_SOURCE_SUFFIX = ('.py', 'U', PY_SOURCE)
_PKG_DIRECTORY_SUFFIX = ('', '', PKG_DIRECTORY)


def get_suffixes():
  """Return a list that describes the files that find_module() looks for."""
  return [_PY_SOURCE_SUFFIX]


def find_module(name, path=None):
  """Try to find the named module on the given search path or sys.path."""
  if path == None:
    path = sys.path

  for directory in path:
    filename = os.path.join(directory, '%s.py' % name)
    if os.path.exists(filename):
      return open(filename, 'U'), filename, _PY_SOURCE_SUFFIX

    dirname = os.path.join(directory, name)
    filename = os.path.join(dirname, '__init__.py')
    if os.path.exists(filename):
      return None, dirname, _PKG_DIRECTORY_SUFFIX

  raise ImportError('No module named %s' % name)


def load_module(name, file_, pathname, description):
  """Load or reload the specified module.

  Please note that this function has only rudimentary supported on App Engine:
  Only loading packages is supported.
  """
  suffix, mode, type_ = description
  if type_ == PKG_DIRECTORY:
    if name in sys.modules:
      mod = sys.modules[name]
    else:
      mod = new_module(name)
      sys.modules[name] = mod
    filename = os.path.join(pathname, '__init__.py')
    mod.__file__ = filename
    execfile(filename, mod.__dict__, mod.__dict__)
    return mod
  else:
    raise NotImplementedError('Only importing packages is supported on '
                              'App Engine')


def new_module(name):
  """Return a new empty module object."""
  return type(sys)(name)


def lock_held():
  """Return False since threading is not supported."""
  return False


def acquire_lock():
  """Acquiring the lock is a no-op since no threading is supported."""
  pass


def release_lock():
  """There is no lock to release since acquiring is a no-op when there is no
  threading."""
  pass


def init_builtin(name):
  raise NotImplementedError('This function is not supported on App Engine.')


def init_frozen(name):
  raise NotImplementedError('This function is not supported on App Engine.')


def is_builtin(name):
  return name in sys.builtin_module_names


def is_frozen(name):
  return False


def load_compiled(name, pathname, file_=None):
  raise NotImplementedError('This function is not supported on App Engine.')


def load_dynamic(name, pathname, file_=None):
  raise NotImplementedError('This function is not supported on App Engine.')


def load_source(name, pathname, file_=None):
  raise NotImplementedError('This function is not supported on App Engine.')


class NullImporter(object):
  """Null importer object"""

  def __init__(self, path_string):
    if not path_string:
      raise ImportError("empty pathname")
    elif os.path.isdir(path_string):
      raise ImportError("existing directory")

  def find_module(self, fullname):
    return None
