You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.1 KiB
104 lines
3.1 KiB
3 years ago
|
"""
|
||
|
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:
|
||
|
with open(filename, encoding='utf-8') as fp:
|
||
|
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'.
|
||
|
|
||
|
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'.
|
||
|
"""
|
||
|
|
||
|
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)
|