sparker-client.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #! /usr/bin/env python
  2. import json
  3. import httplib
  4. import urllib
  5. sparker_client_default_host = 'localhost'
  6. sparker_client_default_port = 8080
  7. class SparkerClient:
  8. # Configuration
  9. host = sparker_client_default_host
  10. port = sparker_client_default_port
  11. # State
  12. connection = None
  13. session_id = None
  14. output_cursor = 0
  15. # Constants
  16. POST = 'POST'
  17. GET = 'GET'
  18. DELETE = 'DELETE'
  19. ROOT = '/'
  20. OK = 200
  21. def __init__(self, host=sparker_client_default_host, port=sparker_client_default_port, lang=None):
  22. self.host = host
  23. self.port = port
  24. self.connection = self.create_connection()
  25. self.session_id = self.create_session(lang)
  26. def http_json(self, method, url, body=''):
  27. self.connection.request(method, url, body)
  28. response = self.connection.getresponse()
  29. if response.status != self.OK:
  30. raise Exception(str(response.status) + ' ' + response.reason)
  31. response_text = response.read()
  32. if len(response_text) != 0:
  33. return json.loads(response_text)
  34. return ''
  35. def create_connection(self):
  36. return httplib.HTTPConnection(self.host, self.port)
  37. def create_session(self, lang):
  38. return self.http_json(self.POST, self.ROOT, urllib.urlencode({'lang': lang}))
  39. def get_sessions(self):
  40. return self.http_json(self.GET, self.ROOT)
  41. def get_session(self):
  42. return self.http_json(self.GET, self.ROOT + self.session_id)
  43. def post_input(self, command):
  44. self.http_json(self.POST, self.ROOT + self.session_id, command)
  45. def get_output(self):
  46. output = self.get_session()[self.output_cursor:]
  47. self.output_cursor += len(output)
  48. return output
  49. def delete_session(self):
  50. self.http_json(self.DELETE, self.ROOT + self.session_id)
  51. def close_connection(self):
  52. self.connection.close()
  53. import threading
  54. import time
  55. import sys
  56. class SparkerPoller(threading.Thread):
  57. keep_polling = True
  58. def __init__(self, sparker_client):
  59. threading.Thread.__init__(self)
  60. self.sparker_client = sparker_client
  61. def stop_polling(self):
  62. self.keep_polling = False
  63. def run(self):
  64. while self.keep_polling:
  65. output = self.sparker_client.get_output()
  66. for line in output:
  67. print(line)
  68. time.sleep(1)
  69. if len(sys.argv) == 2:
  70. lang = sys.argv[1]
  71. else:
  72. lang = 'scala'
  73. client = SparkerClient(lang=lang)
  74. poller = SparkerPoller(client)
  75. poller.start()
  76. try:
  77. while True:
  78. line = raw_input()
  79. client.post_input(line)
  80. except:
  81. poller.stop_polling()
  82. client.delete_session()
  83. client.close_connection()
  84. sys.exit(0)