Home | History | Annotate | Download | only in Lib
      1 """
      2 The objects used by the site module to add custom builtins.
      3 """
      4 
      5 # Those objects are almost immortal and they keep a reference to their module
      6 # globals.  Defining them in the site module would keep too many references
      7 # alive.
      8 # Note this means this module should also avoid keep things alive in its
      9 # globals.
     10 
     11 import sys
     12 
     13 class Quitter(object):
     14     def __init__(self, name, eof):
     15         self.name = name
     16         self.eof = eof
     17     def __repr__(self):
     18         return 'Use %s() or %s to exit' % (self.name, self.eof)
     19     def __call__(self, code=None):
     20         # Shells like IDLE catch the SystemExit, but listen when their
     21         # stdin wrapper is closed.
     22         try:
     23             sys.stdin.close()
     24         except:
     25             pass
     26         raise SystemExit(code)
     27 
     28 
     29 class _Printer(object):
     30     """interactive prompt objects for printing the license text, a list of
     31     contributors and the copyright notice."""
     32 
     33     MAXLINES = 23
     34 
     35     def __init__(self, name, data, files=(), dirs=()):
     36         import os
     37         self.__name = name
     38         self.__data = data
     39         self.__lines = None
     40         self.__filenames = [os.path.join(dir, filename)
     41                             for dir in dirs
     42                             for filename in files]
     43 
     44     def __setup(self):
     45         if self.__lines:
     46             return
     47         data = None
     48         for filename in self.__filenames:
     49             try:
     50                 with open(filename, "r") as fp:
     51                     data = fp.read()
     52                 break
     53             except OSError:
     54                 pass
     55         if not data:
     56             data = self.__data
     57         self.__lines = data.split('\n')
     58         self.__linecnt = len(self.__lines)
     59 
     60     def __repr__(self):
     61         self.__setup()
     62         if len(self.__lines) <= self.MAXLINES:
     63             return "\n".join(self.__lines)
     64         else:
     65             return "Type %s() to see the full %s text" % ((self.__name,)*2)
     66 
     67     def __call__(self):
     68         self.__setup()
     69         prompt = 'Hit Return for more, or q (and Return) to quit: '
     70         lineno = 0
     71         while 1:
     72             try:
     73                 for i in range(lineno, lineno + self.MAXLINES):
     74                     print(self.__lines[i])
     75             except IndexError:
     76                 break
     77             else:
     78                 lineno += self.MAXLINES
     79                 key = None
     80                 while key is None:
     81                     key = input(prompt)
     82                     if key not in ('', 'q'):
     83                         key = None
     84                 if key == 'q':
     85                     break
     86 
     87 
     88 class _Helper(object):
     89     """Define the builtin 'help'.
     90 
     91     This is a wrapper around pydoc.help that provides a helpful message
     92     when 'help' is typed at the Python interactive prompt.
     93 
     94     Calling help() at the Python prompt starts an interactive help session.
     95     Calling help(thing) prints help for the python object 'thing'.
     96     """
     97 
     98     def __repr__(self):
     99         return "Type help() for interactive help, " \
    100                "or help(object) for help about object."
    101     def __call__(self, *args, **kwds):
    102         import pydoc
    103         return pydoc.help(*args, **kwds)
    104