Skip to content

Instantly share code, notes, and snippets.

@jackywyz
Forked from derekwyatt/broker.py
Created September 1, 2011 01:27
Show Gist options
  • Save jackywyz/1185179 to your computer and use it in GitHub Desktop.
Save jackywyz/1185179 to your computer and use it in GitHub Desktop.
This is an ENSIME broker to be used for Vim integration to ENSIME... just a prototype at this point
#!/usr/bin/python
import socket
import re
from time import sleep
from os import system
from threading import Thread
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-c", "--command", dest="command", help="The full shell command line to execute")
parser.add_option("-p", "--port", dest="port", help="The port number of the running ENSIME server")
parser.add_option("-f", "--fifo", dest="fifo", help="The FIFO used to communicate with the client script input")
parser.add_option("-r", "--respond", dest="resp", help="The command to run when responses come in")
(options, args) = parser.parse_args()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', int(options.port)))
class ENSIMESender:
def __init__(self, socket):
self.socket = socket
self.sendSequence = 1
def send(self, data):
tosend = "(%s %d)" % (data.rstrip('\n'), self.sendSequence)
tosend = "%06x%s" % (len(tosend), tosend)
self.socket.send(tosend)
self.sendSequence = self.sendSequence + 1
class ENSIMEReceiver(Thread):
def __init__(self, socket, command):
Thread.__init__(self)
self.sock = socket
self.command = command
def run(self):
respnum = 1
while 1:
header = int(self.sock.recv(6), 16)
swank = self.sock.recv(header)
outfilename = "/tmp/ensime.broker." + str(respnum)
outfile = open(outfilename, "w")
outfile.write(swank + "\n")
outfile.close()
system(re.sub(r'%F', outfilename, self.command))
respnum = respnum + 1
class ClientReceiver(Thread):
def __init__(self, fifo, sender):
Thread.__init__(self)
self.fifo = fifo
self.sender = sender
def run(self):
done = 0
while done == 0:
f = open(self.fifo, 'r')
message = f.readline()
f.close
if message.startswith("quit"):
done = 1
else:
sender.send(message)
# Main
ensimeReceiver = ENSIMEReceiver(s, options.resp)
ensimeReceiver.setDaemon(True)
ensimeReceiver.start()
sender = ENSIMESender(s)
clientReceiver = ClientReceiver(options.fifo, sender)
clientReceiver.start()
clientReceiver.join()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment