blob: c29cf4bf8fe488775adcf173aecfd4de57210246 [file] [log] [blame]
Antoine Pitrou853395b2013-08-06 22:56:40 +02001"""
2The 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
11import sys
12
13class 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
29class _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
88class _Helper(object):
89 """Define the builtin 'help'.
Antoine Pitrou853395b2013-08-06 22:56:40 +020090
R David Murray3d050dd2014-04-19 12:59:30 -040091 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'.
Antoine Pitrou853395b2013-08-06 22:56:40 +020096 """
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)