| 
									
										
										
										
											2006-01-24 16:16:19 +00:00
										 |  |  | # $Id$ | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Locate all standard modules available in this build. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This script is designed to run on Python 1.5.2 and newer. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Written by Fredrik Lundh, January 2005 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import imp, sys, os, re, time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | identifier = "python-%s-%s" % (sys.version[:3], sys.platform) | 
					
						
							|  |  |  | timestamp = time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(time.time())) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # known test packages | 
					
						
							|  |  |  | TEST_PACKAGES = "test.", "bsddb.test.", "distutils.tests." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import platform | 
					
						
							|  |  |  |     platform = platform.platform() | 
					
						
							|  |  |  | except: | 
					
						
							|  |  |  |     platform = None # unknown | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | suffixes = imp.get_suffixes() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_suffix(file): | 
					
						
							|  |  |  |     for suffix in suffixes: | 
					
						
							|  |  |  |         if file[-len(suffix[0]):] == suffix[0]: | 
					
						
							|  |  |  |             return suffix | 
					
						
							|  |  |  |     return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     path = getpath() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     modules = {} | 
					
						
							|  |  |  |     for m in sys.builtin_module_names: | 
					
						
							|  |  |  |         modules[m] = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for p in path: | 
					
						
							|  |  |  |         modules.update(getmodules(p)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-21 02:11:39 +00:00
										 |  |  |     keys = sorted(modules.keys()) | 
					
						
							| 
									
										
										
										
											2006-01-24 16:16:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # filter out known test packages | 
					
						
							|  |  |  |     def cb(m): | 
					
						
							|  |  |  |         for d in TEST_PACKAGES: | 
					
						
							|  |  |  |             if m[:len(d)] == d: | 
					
						
							|  |  |  |                 return 0 | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  |     keys = filter(cb, keys) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         outfile = sys.argv[1] | 
					
						
							|  |  |  |         if outfile == "-": | 
					
						
							|  |  |  |             outfile = None | 
					
						
							|  |  |  |         elif outfile == "-f": | 
					
						
							|  |  |  |             outfile = "modules-" + identifier + ".txt" | 
					
						
							|  |  |  |     except IndexError: | 
					
						
							|  |  |  |         outfile = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if not outfile: | 
					
						
							|  |  |  |         out = sys.stdout | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         out = open(outfile, "w") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     out.write("# module list (generated by listmodules.py)\n") | 
					
						
							|  |  |  |     out.write("#\n") | 
					
						
							|  |  |  |     out.write("# timestamp=%s\n" % repr(timestamp)) | 
					
						
							|  |  |  |     out.write("# sys.version=%s\n" % repr(sys.version)) | 
					
						
							|  |  |  |     out.write("# sys.platform=%s\n" % repr(sys.platform)) | 
					
						
							|  |  |  |     if platform: | 
					
						
							|  |  |  |         out.write("# platform=%s\n" % repr(platform)) | 
					
						
							|  |  |  |     out.write("#\n") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for k in keys: | 
					
						
							|  |  |  |         out.write(k + "\n") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if out is not sys.stdout: | 
					
						
							|  |  |  |         out.close() | 
					
						
							| 
									
										
										
										
											2007-03-21 02:11:39 +00:00
										 |  |  |         print(out.name, "ok (%d modules)" % len(modules)) | 
					
						
							| 
									
										
										
										
											2006-01-24 16:16:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def getmodules(p): | 
					
						
							|  |  |  |     # get modules in a given directory | 
					
						
							|  |  |  |     modules = {} | 
					
						
							|  |  |  |     for f in os.listdir(p): | 
					
						
							|  |  |  |         f = os.path.join(p, f) | 
					
						
							|  |  |  |         if os.path.isfile(f): | 
					
						
							|  |  |  |             m, e = os.path.splitext(f) | 
					
						
							|  |  |  |             suffix = get_suffix(f) | 
					
						
							|  |  |  |             if not suffix: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             m = os.path.basename(m) | 
					
						
							|  |  |  |             if re.compile("(?i)[a-z_]\w*$").match(m): | 
					
						
							|  |  |  |                 if suffix[2] == imp.C_EXTENSION: | 
					
						
							|  |  |  |                     # check that this extension can be imported | 
					
						
							|  |  |  |                     try: | 
					
						
							|  |  |  |                         __import__(m) | 
					
						
							|  |  |  |                     except ImportError: | 
					
						
							|  |  |  |                         continue | 
					
						
							|  |  |  |                 modules[m] = f | 
					
						
							|  |  |  |         elif os.path.isdir(f): | 
					
						
							|  |  |  |             m = os.path.basename(f) | 
					
						
							|  |  |  |             if os.path.isfile(os.path.join(f, "__init__.py")): | 
					
						
							|  |  |  |                 for mm, f in getmodules(f).items(): | 
					
						
							|  |  |  |                     modules[m + "." + mm] = f | 
					
						
							|  |  |  |     return modules | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getpath(): | 
					
						
							|  |  |  |     path = map(os.path.normcase, map(os.path.abspath, sys.path[:])) | 
					
						
							|  |  |  |     # get rid of site packages | 
					
						
							|  |  |  |     for p in path: | 
					
						
							|  |  |  |         if p[-13:] == "site-packages": | 
					
						
							|  |  |  |             def cb(p, site_package_path=os.path.abspath(p)): | 
					
						
							|  |  |  |                 return p[:len(site_package_path)] != site_package_path | 
					
						
							|  |  |  |             path = filter(cb, path) | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |     # get rid of non-existent directories and the current directory | 
					
						
							|  |  |  |     def cb(p, cwd=os.path.normcase(os.getcwd())): | 
					
						
							|  |  |  |         return os.path.isdir(p) and p != cwd | 
					
						
							|  |  |  |     path = filter(cb, path) | 
					
						
							|  |  |  |     return path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main() |