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