| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  | from test import support | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2001-01-20 19:54:20 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2002-04-11 20:04:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-20 19:54:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  | class NoAll(RuntimeError): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FailedImport(RuntimeError): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  | class AllTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def check_all(self, modname): | 
					
						
							|  |  |  |         names = {} | 
					
						
							| 
									
										
										
										
											2010-10-29 11:53:34 +00:00
										 |  |  |         with support.check_warnings( | 
					
						
							|  |  |  |             (".* (module|package)", DeprecationWarning), | 
					
						
							|  |  |  |             ("", ResourceWarning), | 
					
						
							|  |  |  |             quiet=True): | 
					
						
							| 
									
										
										
										
											2008-05-06 23:48:04 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 exec("import %s" % modname, names) | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |             except: | 
					
						
							| 
									
										
										
										
											2008-05-06 23:48:04 +00:00
										 |  |  |                 # Silent fail here seems the best route since some modules | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |                 # may not be available or not initialize properly in all | 
					
						
							|  |  |  |                 # environments. | 
					
						
							|  |  |  |                 raise FailedImport(modname) | 
					
						
							|  |  |  |         if not hasattr(sys.modules[modname], "__all__"): | 
					
						
							|  |  |  |             raise NoAll(modname) | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |         names = {} | 
					
						
							| 
									
										
										
										
											2013-05-01 14:58:09 +03:00
										 |  |  |         with self.subTest(module=modname): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 exec("from %s import *" % modname, names) | 
					
						
							|  |  |  |             except Exception as e: | 
					
						
							|  |  |  |                 # Include the module name in the exception string | 
					
						
							|  |  |  |                 self.fail("__all__ failure in {}: {}: {}".format( | 
					
						
							|  |  |  |                           modname, e.__class__.__name__, e)) | 
					
						
							|  |  |  |             if "__builtins__" in names: | 
					
						
							|  |  |  |                 del names["__builtins__"] | 
					
						
							|  |  |  |             keys = set(names) | 
					
						
							|  |  |  |             all_list = sys.modules[modname].__all__ | 
					
						
							|  |  |  |             all_set = set(all_list) | 
					
						
							|  |  |  |             self.assertCountEqual(all_set, all_list, "in module {}".format(modname)) | 
					
						
							|  |  |  |             self.assertEqual(keys, all_set, "in module {}".format(modname)) | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |     def walk_modules(self, basedir, modpath): | 
					
						
							|  |  |  |         for fn in sorted(os.listdir(basedir)): | 
					
						
							|  |  |  |             path = os.path.join(basedir, fn) | 
					
						
							|  |  |  |             if os.path.isdir(path): | 
					
						
							|  |  |  |                 pkg_init = os.path.join(path, '__init__.py') | 
					
						
							|  |  |  |                 if os.path.exists(pkg_init): | 
					
						
							|  |  |  |                     yield pkg_init, modpath + fn | 
					
						
							|  |  |  |                     for p, m in self.walk_modules(path, modpath + fn + "."): | 
					
						
							|  |  |  |                         yield p, m | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if not fn.endswith('.py') or fn == '__init__.py': | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             yield path, modpath + fn[:-3] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |     def test_all(self): | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |         # Blacklisted modules and packages | 
					
						
							|  |  |  |         blacklist = set([ | 
					
						
							|  |  |  |             # Will raise a SyntaxError when compiling the exec statement | 
					
						
							|  |  |  |             '__future__', | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |         if not sys.platform.startswith('java'): | 
					
						
							|  |  |  |             # In case _socket fails to build, make this test fail more gracefully | 
					
						
							|  |  |  |             # than an AttributeError somewhere deep in CGIHTTPServer. | 
					
						
							|  |  |  |             import _socket | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # rlcompleter needs special consideration; it import readline which | 
					
						
							|  |  |  |         # initializes GNU readline which calls setlocale(LC_CTYPE, "")... :-( | 
					
						
							| 
									
										
										
										
											2014-11-02 19:08:35 +02:00
										 |  |  |         import locale | 
					
						
							|  |  |  |         locale_tuple = locale.getlocale(locale.LC_CTYPE) | 
					
						
							| 
									
										
										
										
											2001-02-12 03:27:31 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |             import rlcompleter | 
					
						
							| 
									
										
										
										
											2013-07-04 18:16:15 -04:00
										 |  |  |         except ImportError: | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |             pass | 
					
						
							| 
									
										
										
										
											2014-11-02 19:08:35 +02:00
										 |  |  |         finally: | 
					
						
							|  |  |  |             locale.setlocale(locale.LC_CTYPE, locale_tuple) | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ignored = [] | 
					
						
							|  |  |  |         failed_imports = [] | 
					
						
							|  |  |  |         lib_dir = os.path.dirname(os.path.dirname(__file__)) | 
					
						
							|  |  |  |         for path, modname in self.walk_modules(lib_dir, ""): | 
					
						
							|  |  |  |             m = modname | 
					
						
							|  |  |  |             blacklisted = False | 
					
						
							|  |  |  |             while m: | 
					
						
							|  |  |  |                 if m in blacklist: | 
					
						
							|  |  |  |                     blacklisted = True | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |                 m = m.rpartition('.')[0] | 
					
						
							|  |  |  |             if blacklisted: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if support.verbose: | 
					
						
							|  |  |  |                 print(modname) | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2009-10-10 21:08:31 +00:00
										 |  |  |                 # This heuristic speeds up the process by removing, de facto, | 
					
						
							|  |  |  |                 # most test modules (and avoiding the auto-executing ones). | 
					
						
							|  |  |  |                 with open(path, "rb") as f: | 
					
						
							|  |  |  |                     if b"__all__" not in f.read(): | 
					
						
							|  |  |  |                         raise NoAll(modname) | 
					
						
							|  |  |  |                     self.check_all(modname) | 
					
						
							|  |  |  |             except NoAll: | 
					
						
							|  |  |  |                 ignored.append(modname) | 
					
						
							|  |  |  |             except FailedImport: | 
					
						
							|  |  |  |                 failed_imports.append(modname) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if support.verbose: | 
					
						
							|  |  |  |             print('Following modules have no __all__ and have been ignored:', | 
					
						
							|  |  |  |                   ignored) | 
					
						
							|  |  |  |             print('Following modules failed to be imported:', failed_imports) | 
					
						
							| 
									
										
										
										
											2001-01-20 19:54:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-09 21:40:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2013-06-12 20:12:30 -04:00
										 |  |  |     unittest.main() |