210 lines
7.3 KiB
Python
210 lines
7.3 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
"""YAP Stuff for Main IPython class."""
|
||
|
|
||
|
#-----------------------------------------------------------------------------
|
||
|
# Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
|
||
|
# Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
|
||
|
# Copyright (C) 2008-2011 The IPython Development Team
|
||
|
#
|
||
|
# Distributed under the terms of the BSD License. The full license is in
|
||
|
# the file COPYING, distributed as part of this software.
|
||
|
#-----------------------------------------------------------------------------
|
||
|
|
||
|
from __future__ import absolute_import, print_function
|
||
|
|
||
|
import __future__
|
||
|
import abc
|
||
|
import ast
|
||
|
import atexit
|
||
|
import functools
|
||
|
import os
|
||
|
import re
|
||
|
import runpy
|
||
|
import signal
|
||
|
|
||
|
import sys
|
||
|
import tempfile
|
||
|
import traceback
|
||
|
import types
|
||
|
import subprocess
|
||
|
import warnings
|
||
|
import yap
|
||
|
from io import open as io_open
|
||
|
|
||
|
from pickleshare import PickleShareDB
|
||
|
|
||
|
from traitlets.config.configurable import SingletonConfigurable
|
||
|
from IPython.core import oinspect
|
||
|
from IPython.core import magic
|
||
|
from IPython.core import page
|
||
|
from IPython.core import prefilter
|
||
|
from IPython.core import shadowns
|
||
|
from IPython.core import ultratb
|
||
|
from IPython.core import interactiveshell
|
||
|
from IPython.core.alias import Alias, AliasManager
|
||
|
from IPython.core.autocall import ExitAutocall
|
||
|
from IPython.core.builtin_trap import BuiltinTrap
|
||
|
from IPython.core.events import EventManager, available_events
|
||
|
from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
|
||
|
from IPython.core.debugger import Pdb
|
||
|
from IPython.core.display_trap import DisplayTrap
|
||
|
from IPython.core.displayhook import DisplayHook
|
||
|
from IPython.core.displaypub import DisplayPublisher
|
||
|
from IPython.core.error import InputRejected, UsageError
|
||
|
from IPython.core.extensions import ExtensionManager
|
||
|
from IPython.core.formatters import DisplayFormatter
|
||
|
from IPython.core.history import HistoryManager
|
||
|
from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
|
||
|
from IPython.core.logger import Logger
|
||
|
from IPython.core.macro import Macro
|
||
|
from IPython.core.payload import PayloadManager
|
||
|
from IPython.core.prefilter import PrefilterManager
|
||
|
from IPython.core.profiledir import ProfileDir
|
||
|
from IPython.core.usage import default_banner
|
||
|
from IPython.core.interactiveshell import InteractiveShellABC, InteractiveShell, ExecutionResult
|
||
|
from IPython.testing.skipdoctest import skip_doctest_py2, skip_doctest
|
||
|
from IPython.utils import PyColorize
|
||
|
from IPython.utils import io
|
||
|
from IPython.utils import py3compat
|
||
|
from IPython.utils import openpy
|
||
|
from IPython.utils.decorators import undoc
|
||
|
from IPython.utils.io import ask_yes_no
|
||
|
from IPython.utils.ipstruct import Struct
|
||
|
from IPython.paths import get_ipython_dir
|
||
|
from IPython.utils.path import get_home_dir, get_py_filename, ensure_dir_exists
|
||
|
from IPython.utils.process import system, getoutput
|
||
|
from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
|
||
|
with_metaclass, iteritems)
|
||
|
from IPython.utils.strdispatch import StrDispatch
|
||
|
from IPython.utils.syspathcontext import prepended_to_syspath
|
||
|
from IPython.utils.text import format_screen, LSString, SList, DollarFormatter
|
||
|
from IPython.utils.tempdir import TemporaryDirectory
|
||
|
from traitlets import (
|
||
|
Integer, Bool, CaselessStrEnum, Enum, List, Dict, Unicode, Instance, Type,
|
||
|
observe, default,
|
||
|
)
|
||
|
from warnings import warn
|
||
|
from logging import error
|
||
|
|
||
|
class YAPInteractiveShell:
|
||
|
"""An enhanced, interactive shell for YAP."""
|
||
|
|
||
|
def __init__(self, kernel):
|
||
|
self.yapeng = yap.YAPEngine()
|
||
|
self.q = None
|
||
|
self.shell = kernel.shell
|
||
|
self.shell.run_cell = self.run_cell
|
||
|
|
||
|
def closeq(self):
|
||
|
if self.q:
|
||
|
self.q.close()
|
||
|
self.q = None
|
||
|
|
||
|
def run_cell(self, s, store_history=True, silent=False, shell_futures=True):
|
||
|
|
||
|
"""Run a complete IPython cell.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
raw_cell : str
|
||
|
The code (including IPython code such as %magic functions) to run.
|
||
|
store_history : bool
|
||
|
If True, the raw and translated cell will be stored in IPython's
|
||
|
history. For user code calling back into IPython's machinery, this
|
||
|
should be set to False.
|
||
|
silent : bool
|
||
|
If True, avoid side-effects, such as implicit displayhooks and
|
||
|
and logging. silent=True forces store_history=False.
|
||
|
shell_futures : bool
|
||
|
If True, the code will share future statements with the interactive
|
||
|
shell. It will both be affected by previous __future__ imports, and
|
||
|
any __future__ imports in the code will affect the shell. If False,
|
||
|
__future__ imports are not shared in either direction.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
result : :class:`ExecutionResult`
|
||
|
"""
|
||
|
|
||
|
result = ExecutionResult()
|
||
|
|
||
|
if (not s) or s.isspace():
|
||
|
self.shell.last_execution_succeeded = True
|
||
|
return result
|
||
|
|
||
|
if store_history:
|
||
|
result.execution_count = self.shell.execution_count
|
||
|
|
||
|
def error_before_exec(value):
|
||
|
result.error_before_exec = value
|
||
|
self.shell.last_execution_succeeded = False
|
||
|
return result
|
||
|
|
||
|
|
||
|
if not self.q:
|
||
|
try:
|
||
|
self.q = self.yapeng.query(s)
|
||
|
except SyntaxError:
|
||
|
return error_before_exec( sys.exc_info()[1])
|
||
|
|
||
|
cell = s # cell has to exist so it can be stored/logged
|
||
|
|
||
|
# Store raw and processed history
|
||
|
# if not silent:
|
||
|
# self.shell..logger.log(cell, s)
|
||
|
|
||
|
has_raised = False
|
||
|
try:
|
||
|
#f = io.StringIO()
|
||
|
# with redirect_stdout(f):
|
||
|
run = self.q.next()
|
||
|
# print('{0}'.format(f.getvalue()))
|
||
|
# Execute the user code
|
||
|
if run:
|
||
|
myvs = self.q.namedVarsCopy()
|
||
|
if myvs:
|
||
|
i = 0
|
||
|
for peq in myvs:
|
||
|
name = peq[0]
|
||
|
bind = peq[1]
|
||
|
if bind.isVar():
|
||
|
var = yap.YAPAtom('$VAR')
|
||
|
f = yap.YAPFunctor(var, 1)
|
||
|
bind.unify(yap.YAPApplTerm(f, (name)))
|
||
|
else:
|
||
|
i = bind.numberVars(i, True)
|
||
|
print(name.text() + " = " + bind.text())
|
||
|
else:
|
||
|
print("yes")
|
||
|
if self.q.deterministic():
|
||
|
self.closeq()
|
||
|
else:
|
||
|
print("No (more) answers")
|
||
|
self.closeq()
|
||
|
except:
|
||
|
result.error_in_exec = sys.exc_info()[1]
|
||
|
# self.showtraceback()
|
||
|
has_raised = True
|
||
|
self.closeq()
|
||
|
|
||
|
|
||
|
self.shell.last_execution_succeeded = not has_raised
|
||
|
result.result = self.shell.last_execution_succeeded
|
||
|
print( self.q )
|
||
|
# Reset this so later displayed values do not modify the
|
||
|
# ExecutionResult
|
||
|
# self.displayhook.exec_result = None
|
||
|
|
||
|
#self.events.trigger('post_execute')
|
||
|
#if not silent:
|
||
|
# self.events.trigger('post_run_cell')
|
||
|
|
||
|
if store_history:
|
||
|
# Write output to the database. Does nothing unless
|
||
|
# history output logging is enabled.
|
||
|
# self.history_manager.store_output(self.execution_count)
|
||
|
# Each cell is a *single* input, regardless of how many lines it has
|
||
|
self.shell.execution_count += 1
|
||
|
|
||
|
return result
|