Refactored pretty much everything.

I finally got around to making CLI calls happen async. This means things
no longer lock up when the plugin is doing things.
This commit is contained in:
David Diaz 2017-12-24 00:29:35 -06:00
parent d44e982585
commit 634cb564b0
1 changed files with 56 additions and 92 deletions

114
beau.py
View File

@ -1,13 +1,15 @@
import json import json
import platform import platform
import sublime
import sublime_plugin import sublime_plugin
from http.client import responses from http.client import responses
from subprocess import Popen, PIPE from sublime import load_settings, active_window
from subprocess import check_output
SETTINGS_FILE = 'Beau.sublime-settings' SETTINGS_FILE = 'Beau.sublime-settings'
SYNTAX = 'Packages/JavaScript/JSON.sublime-syntax' SYNTAX = 'Packages/JavaScript/JSON.sublime-syntax'
is_windows = (platform.system() == 'Windows')
class InsertTextCommand(sublime_plugin.TextCommand): class InsertTextCommand(sublime_plugin.TextCommand):
def run(self, edit, text): def run(self, edit, text):
self.view.insert(edit, 0, text) self.view.insert(edit, 0, text)
@ -16,103 +18,58 @@ class BeauCommand(sublime_plugin.TextCommand):
requests = [] requests = []
path = '' path = ''
def inThread(self, command, onComplete):
def thread(command, onComplete):
proc = check_output(command, shell=is_windows)
onComplete(proc)
return
thread = threading.Thread(target=thread, args=(command, onComplete))
thread.start()
return thread
def run(self, edit): def run(self, edit):
settings = sublime.load_settings(SETTINGS_FILE) settings = load_settings(SETTINGS_FILE)
self.path = settings.get('cli_path', '') self.path = settings.get('cli_path', '')
active_window = sublime.active_window() active_view = active_window().active_view()
active_view = active_window.active_view()
scope = active_view.scope_name(active_view.sel()[0].b) scope = active_view.scope_name(active_view.sel()[0].b)
if not scope.startswith('source.yaml'): if not scope.startswith('source.yaml'):
active_window.status_message('Beau can only be ran on yaml files.') active_window().status_message('Beau can only be ran on yaml files.')
return return
print('Using ' + self.path) self.inThread(
print([ [self.path, '-c', active_view.file_name(), 'list', '--no-format'],
self.path, self.listFetched
'-c', )
active_view.file_name(),
'list',
'--no-format'
])
proc = Popen([
self.path,
'-c',
active_view.file_name(),
'list',
'--no-format'
], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=self.is_windows())
for line in iter(proc.stderr.readline, b''):
print(line)
active_window.status_message(line.decode("utf-8"))
def listFetched(self, list):
requests = [] requests = []
self.requests[:] = [] self.requests[:] = []
for line in iter(proc.stdout.readline, b''): for line in list.splitlines():
req = line.decode('utf-8').rstrip().split('\t') req = line.decode('utf-8').rstrip().split('\t')
if len(req) == 3:
method, alias, endpoint = req method, alias, endpoint = req
requests.append([alias, endpoint]) requests.append([alias, endpoint])
self.requests.append(req) self.requests.append(req)
elif len(req) == 5: active_window().show_quick_panel(requests, self.on_request_selected)
method, alias, endpoint, title, description = req
self.requests.append([method, alias, endpoint])
if description == 'undefined': def on_request_selected(self, index):
description = endpoint
if title == 'undefined':
title = alias
else:
title = title + ' (' + alias + ')'
requests.append([title, description])
proc.wait()
active_window.show_quick_panel(requests, self.on_done)
def on_done(self, index):
if index == -1: if index == -1:
return return
active_window = sublime.active_window() active_view = active_window().active_view()
active_view = active_window.active_view()
method, alias, endpoint = self.requests[index] method, alias, endpoint = self.requests[index]
active_window.status_message('Executing: ' + alias) active_window().status_message('Running: ' + alias)
print([
self.path,
'-c',
active_view.file_name(),
'request',
alias,
'--no-format'
])
proc = Popen([
self.path,
'-c',
active_view.file_name(),
'request',
alias,
'--no-format'
], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=self.is_windows())
for line in iter(proc.stderr.readline, b''):
print(line)
active_window.status_message(line.decode("utf-8"))
def handleResult(result):
response = [] response = []
for line in iter(proc.stdout.readline, b''): for line in result.splitlines():
response.append(line.rstrip()) response.append(line.rstrip())
active_window.status_message('') active_window().status_message('')
status, endpoint, headers, body = response status, endpoint, headers, body = response
@ -121,13 +78,15 @@ class BeauCommand(sublime_plugin.TextCommand):
headers = headers.decode('utf-8') headers = headers.decode('utf-8')
body = body.decode('utf-8') body = body.decode('utf-8')
results_view = active_window.new_file() results_view = active_window().new_file()
results_view.set_name('Results: ' + alias) results_view.set_name('Results: ' + alias)
content = method + ' ' + endpoint + '\n' content = method + ' ' + endpoint + '\n'
content += status + ' ' + responses[int(status)] + '\n\n' content += status + ' ' + responses[int(status)] + '\n\n'
content += 'Response Headers: \n' content += 'Response Headers: \n'
content += self.autoindent(headers) content += self.autoindent(headers)
content += '\n\nResponse Body: \n' content += '\n\nResponse Body: \n'
content += self.autoindent(body) content += self.autoindent(body)
@ -135,6 +94,11 @@ class BeauCommand(sublime_plugin.TextCommand):
results_view.set_scratch(True) results_view.set_scratch(True)
results_view.set_syntax_file(SYNTAX) results_view.set_syntax_file(SYNTAX)
self.inThread(
[self.path, '-c', active_view.file_name(), 'request', alias, '--no-format'],
onComplete=handleResult
)
def autoindent(self, obj): def autoindent(self, obj):
parsed = json.loads(obj) parsed = json.loads(obj)
return json.dumps( return json.dumps(