blob: 1f21358e2685f53e831a91e11108ebfe0f59ddca [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'.
90 This is a wrapper around pydoc.help (with a twist).
91
92 """
93
94 def __repr__(self):
95 return "Type help() for interactive help, " \
96 "or help(object) for help about object."
97 def __call__(self, *args, **kwds):
98 import pydoc
99 return pydoc.help(*args, **kwds)