blob: fd3ac749b374b5b20c03479154fad75e13d494da [file] [log] [blame]
Jack Jansen144fa671998-06-26 14:56:00 +00001"""macmodulefinder - Find modules used in a script. Only slightly
2mac-specific, really."""
3
4import sys
5import os
6
7import directives
8
9try:
10 # This will work if we are frozen ourselves
11 import modulefinder
12except ImportError:
13 # And this will work otherwise
14 _FREEZEDIR=os.path.join(sys.prefix, ':Tools:freeze')
15 sys.path.insert(0, _FREEZEDIR)
16 import modulefinder
17
18#
19# Modules that must be included, and modules that need not be included
20# (but are if they are found)
21#
22MAC_INCLUDE_MODULES=['site', 'exceptions']
23MAC_MAYMISS_MODULES=['posix', 'os2', 'nt', 'dos', 'dospath', 'nturl2path', 'pwd', 'sitecustomize']
24
25# An exception:
26Missing="macmodulefinder.Missing"
27
28class Module(modulefinder.Module):
29
30 def gettype(self):
31 """Return type of module"""
32 if self.__path__:
33 return 'package'
34 if self.__code__:
35 return 'module'
36 if self.__file__:
37 return 'dynamic'
38 return 'builtin'
39
40class ModuleFinder(modulefinder.ModuleFinder):
41
42 def add_module(self, fqname):
43 if self.modules.has_key(fqname):
44 return self.modules[fqname]
45 self.modules[fqname] = m = Module(fqname)
46 return m
47
48def process(program, modules=[], module_files = [], debug=0):
49 error = []
50 #
51 # Add the standard modules needed for startup
52 #
53 modules = modules + MAC_INCLUDE_MODULES
54 #
55 # search the main source for directives
56 #
57 extra_modules, exclude_modules, extra_path = \
58 directives.findfreezedirectives(program)
59 for m in extra_modules:
60 if os.sep in m:
61 # It is a file
62 module_files.append(m)
63 else:
64 modules.append(m)
Jack Jansen201f46d1998-08-18 12:21:48 +000065 # collect all modules of the program
66 path = sys.path[:]
67 dir = os.path.dirname(program)
68 path[0] = dir # "current dir"
69 path = extra_path + path
Jack Jansen144fa671998-06-26 14:56:00 +000070 #
71 # Create the module finder and let it do its work
72 #
73 modfinder = ModuleFinder(path,
74 excludes=exclude_modules, debug=debug)
75 for m in modules:
76 modfinder.import_hook(m)
77 for m in module_files:
78 modfinder.load_file(m)
79 modfinder.run_script(program)
80 module_dict = modfinder.modules
81 #
82 # Tell the user about missing modules
83 #
84 maymiss = exclude_modules + MAC_MAYMISS_MODULES
85 for m in modfinder.badmodules.keys():
86 if not m in maymiss:
87 if debug > 0:
88 print 'Missing', m
89 error.append(m)
90 #
91 # Warn the user about unused builtins
92 #
93 for m in sys.builtin_module_names:
94 if m in ('__main__', '__builtin__'):
95 pass
96 elif not module_dict.has_key(m):
97 if debug > 0:
98 print 'Unused', m
99 elif module_dict[m].gettype() != 'builtin':
100 # XXXX Can this happen?
101 if debug > 0:
102 print 'Conflict', m
103 if error:
104 raise Missing, error
105 return module_dict