1
2
3 """
4 This file is part of the web2py Web Framework
5 Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu>
6 License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html)
7
8 This file is not strictly required by web2py. It is used for three purposes:
9
10 1) check that all required modules are installed properly
11 2) provide py2exe and py2app a list of modules to be packaged in the binary
12 3) (optional) preload modules in memory to speed up http responses
13
14 """
15
16 import os
17 import sys
18
19 base_modules = ['aifc', 'anydbm', 'array', 'asynchat', 'asyncore', 'atexit',
20 'audioop', 'base64', 'BaseHTTPServer', 'Bastion', 'binascii',
21 'binhex', 'bisect', 'bz2', 'calendar', 'cgi', 'CGIHTTPServer',
22 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop',
23 'collections', 'colorsys', 'compileall', 'compiler',
24 'compiler.ast', 'compiler.visitor', 'ConfigParser',
25 'contextlib', 'Cookie', 'cookielib', 'copy', 'copy_reg',
26 'cPickle', 'cProfile', 'cStringIO', 'csv', 'ctypes',
27 'datetime', 'decimal', 'difflib', 'dircache', 'dis',
28 'doctest', 'DocXMLRPCServer', 'dumbdbm', 'dummy_thread',
29 'dummy_threading', 'email', 'email.charset', 'email.encoders',
30 'email.errors', 'email.generator', 'email.header',
31 'email.iterators', 'email.message', 'email.mime',
32 'email.mime.audio', 'email.mime.base', 'email.mime.image',
33 'email.mime.message', 'email.mime.multipart',
34 'email.mime.nonmultipart', 'email.mime.text', 'email.parser',
35 'email.utils', 'encodings.idna', 'errno', 'exceptions',
36 'filecmp', 'fileinput', 'fnmatch', 'formatter', 'fpformat',
37 'ftplib', 'functools', 'gc', 'getopt', 'getpass', 'gettext',
38 'glob', 'gzip', 'hashlib', 'heapq', 'hmac', 'hotshot',
39 'hotshot.stats', 'htmlentitydefs', 'htmllib', 'HTMLParser',
40 'httplib', 'imaplib', 'imghdr', 'imp', 'inspect',
41 'itertools', 'keyword', 'linecache', 'locale', 'logging',
42 'macpath', 'mailbox', 'mailcap', 'marshal', 'math',
43 'mimetools', 'mimetypes', 'mmap', 'modulefinder', 'mutex',
44 'netrc', 'new', 'nntplib', 'operator', 'optparse', 'os',
45 'parser', 'pdb', 'pickle', 'pickletools', 'pkgutil',
46 'platform', 'poplib', 'pprint', 'py_compile', 'pyclbr',
47 'pydoc', 'Queue', 'quopri', 'random', 're', 'repr',
48 'rexec', 'rfc822', 'rlcompleter', 'robotparser', 'runpy',
49 'sched', 'select', 'sgmllib', 'shelve',
50 'shlex', 'shutil', 'signal', 'SimpleHTTPServer',
51 'SimpleXMLRPCServer', 'site', 'smtpd', 'smtplib',
52 'sndhdr', 'socket', 'SocketServer', 'sqlite3',
53 'stat', 'statvfs', 'string', 'StringIO',
54 'stringprep', 'struct', 'subprocess', 'sunau', 'symbol',
55 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'textwrap', 'thread', 'threading',
56 'time', 'timeit', 'Tix', 'Tkinter', 'token',
57 'tokenize', 'trace', 'traceback', 'types',
58 'unicodedata', 'unittest', 'urllib', 'urllib2',
59 'urlparse', 'user', 'UserDict', 'UserList', 'UserString',
60 'uu', 'uuid', 'warnings', 'wave', 'weakref', 'webbrowser',
61 'whichdb', 'wsgiref', 'wsgiref.handlers', 'wsgiref.headers',
62 'wsgiref.simple_server', 'wsgiref.util', 'wsgiref.validate',
63 'xdrlib', 'xml.dom', 'xml.dom.minidom', 'xml.dom.pulldom',
64 'xml.etree.ElementTree', 'xml.parsers.expat', 'xml.sax',
65 'xml.sax.handler', 'xml.sax.saxutils', 'xml.sax.xmlreader',
66 'xmlrpclib', 'zipfile', 'zipimport', 'zlib', 'mhlib',
67 'MimeWriter', 'mimify', 'multifile', 'sets']
68
69 contributed_modules = []
70 for root, dirs, files in os.walk('gluon'):
71 for candidate in ['.'.join(
72 os.path.join(root, os.path.splitext(name)[0]).split(os.sep))
73 for name in files if name.endswith('.py')
74 and root.split(os.sep) != ['gluon', 'tests']
75 ]:
76 contributed_modules.append(candidate)
77
78
79 python_version = sys.version[:3]
80
81
82 alert_dependency = ['hashlib', 'uuid']
83
84
85
86
87
88 py26_deprecated = ['mhlib', 'multifile', 'mimify', 'sets', 'MimeWriter']
89 py27_deprecated = []
90
91 if python_version >= '2.6':
92 base_modules += ['json', 'multiprocessing']
93 base_modules = list(set(base_modules).difference(set(py26_deprecated)))
94
95 if python_version >= '2.7':
96 base_modules += ['argparse']
97 base_modules = list(set(base_modules).difference(set(py27_deprecated)))
98
99
100 for module in base_modules + contributed_modules:
101 try:
102 __import__(module, globals(), locals(), [])
103 except:
104
105 if module in alert_dependency:
106 msg = "Missing dependency: %(module)s\n" % locals()
107 msg += "Try the following command: "
108 msg += "easy_install-%(python_version)s -U %(module)s" % locals()
109 raise ImportError, msg
110