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')
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()