| 
									
										
										
										
											2013-08-06 22:56:40 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  | The objects used by the site module to add custom builtins. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Those objects are almost immortal and they keep a reference to their module | 
					
						
							|  |  |  | # globals.  Defining them in the site module would keep too many references | 
					
						
							|  |  |  | # alive. | 
					
						
							|  |  |  | # Note this means this module should also avoid keep things alive in its | 
					
						
							|  |  |  | # globals. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Quitter(object): | 
					
						
							|  |  |  |     def __init__(self, name, eof): | 
					
						
							|  |  |  |         self.name = name | 
					
						
							|  |  |  |         self.eof = eof | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return 'Use %s() or %s to exit' % (self.name, self.eof) | 
					
						
							|  |  |  |     def __call__(self, code=None): | 
					
						
							|  |  |  |         # Shells like IDLE catch the SystemExit, but listen when their | 
					
						
							|  |  |  |         # stdin wrapper is closed. | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             sys.stdin.close() | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         raise SystemExit(code) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _Printer(object): | 
					
						
							|  |  |  |     """interactive prompt objects for printing the license text, a list of
 | 
					
						
							|  |  |  |     contributors and the copyright notice."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     MAXLINES = 23 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, name, data, files=(), dirs=()): | 
					
						
							|  |  |  |         import os | 
					
						
							|  |  |  |         self.__name = name | 
					
						
							|  |  |  |         self.__data = data | 
					
						
							|  |  |  |         self.__lines = None | 
					
						
							|  |  |  |         self.__filenames = [os.path.join(dir, filename) | 
					
						
							|  |  |  |                             for dir in dirs | 
					
						
							|  |  |  |                             for filename in files] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __setup(self): | 
					
						
							|  |  |  |         if self.__lines: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         data = None | 
					
						
							|  |  |  |         for filename in self.__filenames: | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2021-04-06 11:18:41 +09:00
										 |  |  |                 with open(filename, encoding='utf-8') as fp: | 
					
						
							| 
									
										
										
										
											2013-08-06 22:56:40 +02:00
										 |  |  |                     data = fp.read() | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             except OSError: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |         if not data: | 
					
						
							|  |  |  |             data = self.__data | 
					
						
							|  |  |  |         self.__lines = data.split('\n') | 
					
						
							|  |  |  |         self.__linecnt = len(self.__lines) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         self.__setup() | 
					
						
							|  |  |  |         if len(self.__lines) <= self.MAXLINES: | 
					
						
							|  |  |  |             return "\n".join(self.__lines) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return "Type %s() to see the full %s text" % ((self.__name,)*2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __call__(self): | 
					
						
							|  |  |  |         self.__setup() | 
					
						
							|  |  |  |         prompt = 'Hit Return for more, or q (and Return) to quit: ' | 
					
						
							|  |  |  |         lineno = 0 | 
					
						
							|  |  |  |         while 1: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 for i in range(lineno, lineno + self.MAXLINES): | 
					
						
							|  |  |  |                     print(self.__lines[i]) | 
					
						
							|  |  |  |             except IndexError: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 lineno += self.MAXLINES | 
					
						
							|  |  |  |                 key = None | 
					
						
							|  |  |  |                 while key is None: | 
					
						
							|  |  |  |                     key = input(prompt) | 
					
						
							|  |  |  |                     if key not in ('', 'q'): | 
					
						
							|  |  |  |                         key = None | 
					
						
							|  |  |  |                 if key == 'q': | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _Helper(object): | 
					
						
							|  |  |  |     """Define the builtin 'help'.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-19 12:59:30 -04:00
										 |  |  |     This is a wrapper around pydoc.help that provides a helpful message | 
					
						
							|  |  |  |     when 'help' is typed at the Python interactive prompt. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Calling help() at the Python prompt starts an interactive help session. | 
					
						
							|  |  |  |     Calling help(thing) prints help for the python object 'thing'. | 
					
						
							| 
									
										
										
										
											2013-08-06 22:56:40 +02:00
										 |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return "Type help() for interactive help, " \ | 
					
						
							|  |  |  |                "or help(object) for help about object." | 
					
						
							|  |  |  |     def __call__(self, *args, **kwds): | 
					
						
							|  |  |  |         import pydoc | 
					
						
							|  |  |  |         return pydoc.help(*args, **kwds) |