| """macmodulefinder - Find modules used in a script. Only slightly |
| mac-specific, really.""" |
| |
| import sys |
| import os |
| |
| import directives |
| |
| try: |
| # This will work if we are frozen ourselves |
| import modulefinder |
| except ImportError: |
| # And this will work otherwise |
| _FREEZEDIR=os.path.join(sys.prefix, ':Tools:freeze') |
| sys.path.insert(0, _FREEZEDIR) |
| import modulefinder |
| |
| # |
| # Modules that must be included, and modules that need not be included |
| # (but are if they are found) |
| # |
| MAC_INCLUDE_MODULES=['site', 'exceptions'] |
| MAC_MAYMISS_MODULES=['posix', 'os2', 'nt', 'dos', 'dospath', 'nturl2path', 'pwd', 'sitecustomize'] |
| |
| # An exception: |
| Missing="macmodulefinder.Missing" |
| |
| class Module(modulefinder.Module): |
| |
| def gettype(self): |
| """Return type of module""" |
| if self.__path__: |
| return 'package' |
| if self.__code__: |
| return 'module' |
| if self.__file__: |
| return 'dynamic' |
| return 'builtin' |
| |
| class ModuleFinder(modulefinder.ModuleFinder): |
| |
| def add_module(self, fqname): |
| if self.modules.has_key(fqname): |
| return self.modules[fqname] |
| self.modules[fqname] = m = Module(fqname) |
| return m |
| |
| def process(program, modules=[], module_files = [], debug=0): |
| error = [] |
| # |
| # Add the standard modules needed for startup |
| # |
| modules = modules + MAC_INCLUDE_MODULES |
| # |
| # search the main source for directives |
| # |
| extra_modules, exclude_modules, extra_path = \ |
| directives.findfreezedirectives(program) |
| for m in extra_modules: |
| if os.sep in m: |
| # It is a file |
| module_files.append(m) |
| else: |
| modules.append(m) |
| path = extra_path + sys.path[:] |
| # |
| # Create the module finder and let it do its work |
| # |
| modfinder = ModuleFinder(path, |
| excludes=exclude_modules, debug=debug) |
| for m in modules: |
| modfinder.import_hook(m) |
| for m in module_files: |
| modfinder.load_file(m) |
| modfinder.run_script(program) |
| module_dict = modfinder.modules |
| # |
| # Tell the user about missing modules |
| # |
| maymiss = exclude_modules + MAC_MAYMISS_MODULES |
| for m in modfinder.badmodules.keys(): |
| if not m in maymiss: |
| if debug > 0: |
| print 'Missing', m |
| error.append(m) |
| # |
| # Warn the user about unused builtins |
| # |
| for m in sys.builtin_module_names: |
| if m in ('__main__', '__builtin__'): |
| pass |
| elif not module_dict.has_key(m): |
| if debug > 0: |
| print 'Unused', m |
| elif module_dict[m].gettype() != 'builtin': |
| # XXXX Can this happen? |
| if debug > 0: |
| print 'Conflict', m |
| if error: |
| raise Missing, error |
| return module_dict |