~ubuntu-branches/ubuntu/quantal/python-django/quantal-security

« back to all changes in this revision

Viewing changes to django/utils/module_loading.py

  • Committer: Bazaar Package Importer
  • Author(s): Chris Lamb
  • Date: 2010-05-21 07:52:55 UTC
  • mfrom: (1.3.6 upstream)
  • mto: This revision was merged to the branch mainline in revision 28.
  • Revision ID: james.westby@ubuntu.com-20100521075255-ii78v1dyfmyu3uzx
Tags: upstream-1.2
ImportĀ upstreamĀ versionĀ 1.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import imp
 
2
import os
 
3
import sys
 
4
 
 
5
 
 
6
def module_has_submodule(package, module_name):
 
7
    """See if 'module' is in 'package'."""
 
8
    name = ".".join([package.__name__, module_name])
 
9
    if name in sys.modules:
 
10
        return True
 
11
    for finder in sys.meta_path:
 
12
        if finder.find_module(name):
 
13
            return True
 
14
    for entry in package.__path__:  # No __path__, then not a package.
 
15
        try:
 
16
            # Try the cached finder.
 
17
            finder = sys.path_importer_cache[entry]
 
18
            if finder is None:
 
19
                # Implicit import machinery should be used.
 
20
                try:
 
21
                    file_, _, _ = imp.find_module(module_name, [entry])
 
22
                    if file_:
 
23
                        file_.close()
 
24
                    return True
 
25
                except ImportError:
 
26
                    continue
 
27
            # Else see if the finder knows of a loader.
 
28
            elif finder.find_module(name):
 
29
                return True
 
30
            else:
 
31
                continue
 
32
        except KeyError:
 
33
            # No cached finder, so try and make one.
 
34
            for hook in sys.path_hooks:
 
35
                try:
 
36
                    finder = hook(entry)
 
37
                    # XXX Could cache in sys.path_importer_cache
 
38
                    if finder.find_module(name):
 
39
                        return True
 
40
                    else:
 
41
                        # Once a finder is found, stop the search.
 
42
                        break
 
43
                except ImportError:
 
44
                    # Continue the search for a finder.
 
45
                    continue
 
46
            else:
 
47
                # No finder found.
 
48
                # Try the implicit import machinery if searching a directory.
 
49
                if os.path.isdir(entry):
 
50
                    try:
 
51
                        file_, _, _ = imp.find_module(module_name, [entry])
 
52
                        if file_:
 
53
                            file_.close()
 
54
                        return True
 
55
                    except ImportError:
 
56
                        pass
 
57
                # XXX Could insert None or NullImporter
 
58
    else:
 
59
        # Exhausted the search, so the module cannot be found.
 
60
        return False