예제 #1
0
파일: repl.py 프로젝트: enriquepablo/terms
 def __init__(self, config):
     self.config = config
     self._buffer = ''
     self.no_response = object()
     self.prompt = '>> '
     if HAS_READLINE and config['terms_history_file'] and int(config['terms_history_length']):
         readline.set_history_length(int(config['terms_history_length']))
         fn = os.path.expanduser(config['terms_history_file'])
         try:
             if not os.path.exists(fn):
                 with open(fn, 'w') as f:
                     f.write('# terms history\n')
             readline.read_history_file(fn)
         except Exception:
             pass
     address = '%s/%s' % (config['dbms'], config['dbname'])
     engine = create_engine(address)
     Session = sessionmaker(bind=engine)
     if config['dbname'] == ':memory:':
         from terms.core.terms import Base
         Base.metadata.create_all(engine)
         from terms.core.network import Network
         Network.initialize(Session())
     self.compiler = Compiler(Session(), config)
     register_exec_global(Runtime(self.compiler), name='runtime')
예제 #2
0
 def run(self):
     for client in iter(self.teller_queue.get, None):
         totell = []
         for msg in iter(client.recv_bytes, b'FINISH-TERMS'):
             totell.append(msg.decode('utf8'))
         totell = '\n'.join(totell)
         session = self.session_factory()
         self.compiler = Compiler(session, self.config)
         register_exec_global(Runtime(self.compiler), name='runtime')
         load_exec_globals(session)
         if totell.startswith('lexicon:'):
             resp = self._from_lexicon(totell)
         elif totell.startswith('compiler:exec_globals:'):
             resp = self._add_execglobal(totell)
         else:
             self.compiler.network.pipe = client
             try:
                 resp = self.compiler.parse(totell)
             except TermNotFound as e:
                 session.rollback()
                 resp = 'Unknown word: ' + e.args[0]
             except TermsSyntaxError as e:
                 session.rollback()
                 resp = 'Terms syntax error: ' + e.args[0]
             except WrongLabel as e:
                 session.rollback()
                 resp = e.args[0]
             except IllegalLabel as e:
                 session.rollback()
                 resp = 'Error: labels cannot contain underscores: %s' % e.args[0]
             except WrongObjectType as e:
                 session.rollback()
                 resp = e.args[0]
             except ImportProblems as e:
                 session.rollback()
                 resp = e.args[0]
             except DuplicateWord as e:
                 session.rollback()
                 resp = e.args[0]
             self.compiler.network.pipe = None
             resp = json.dumps(resp, cls=TermsJSONEncoder)
         try:
             client.send_bytes(str(resp).encode('utf8'))
         except BrokenPipeError:
             pass
         else:
             client.send_bytes(b'END')
         client.close()
         session.close()  # XXX needed?
         self.compliler = None
         self.teller_queue.task_done()  # abyss
     self.teller_queue.task_done()
     self.teller_queue.close()