136 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| import json
 | |
| import platform
 | |
| import sublime
 | |
| import sublime_plugin
 | |
| from http.client import responses
 | |
| from subprocess import Popen, PIPE
 | |
| 
 | |
| SETTINGS_FILE = 'Beau.sublime-settings'
 | |
| SYNTAX = 'Packages/JavaScript/JSON.sublime-syntax'
 | |
| 
 | |
| class InsertTextCommand(sublime_plugin.TextCommand):
 | |
| 	def run(self, edit, text):
 | |
| 		self.view.insert(edit, 0, text)
 | |
| 
 | |
| class BeauCommand(sublime_plugin.TextCommand):
 | |
| 	requests = []
 | |
| 	path = ''
 | |
| 
 | |
| 	def run(self, edit):
 | |
| 		settings = sublime.load_settings(SETTINGS_FILE)
 | |
| 		self.path = settings.get('cli_path', '')
 | |
| 		active_window = sublime.active_window()
 | |
| 		active_view = active_window.active_view()
 | |
| 
 | |
| 		scope = active_view.scope_name(active_view.sel()[0].b)
 | |
| 		if not scope.startswith('source.yaml'):
 | |
| 			active_window.status_message('Beau can only be ran on yaml files.')
 | |
| 			return
 | |
| 
 | |
| 		print('Using ' + self.path)
 | |
| 		print([ self.path, '-c', active_view.file_name(), '--clean-list' ])
 | |
| 
 | |
| 		proc = Popen([
 | |
| 			self.path,
 | |
| 			'-c',
 | |
| 			active_view.file_name(),
 | |
| 			'--clean-list'
 | |
| 		], 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"))
 | |
| 
 | |
| 		requests = []
 | |
| 		self.requests[:] = []
 | |
| 		for line in iter(proc.stdout.readline, b''):
 | |
| 			req = line.decode('utf-8').rstrip().split('\t')
 | |
| 
 | |
| 			if len(req) == 3:
 | |
| 				method, alias, endpoint = req
 | |
| 				requests.append([alias, endpoint])
 | |
| 				self.requests.append(req)
 | |
| 
 | |
| 			elif len(req) == 5:
 | |
| 				method, alias, endpoint, title, description = req
 | |
| 				self.requests.append([method, alias, endpoint])
 | |
| 
 | |
| 				if description == 'undefined':
 | |
| 					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:
 | |
| 			return
 | |
| 
 | |
| 		active_window = sublime.active_window()
 | |
| 		active_view = active_window.active_view()
 | |
| 
 | |
| 		method, alias, endpoint = self.requests[index]
 | |
| 
 | |
| 		active_window.status_message('Executing: ' + alias)
 | |
| 
 | |
| 		print([ self.path, '-c', active_view.file_name(), '-R', alias ])
 | |
| 
 | |
| 		proc = Popen([
 | |
| 			self.path,
 | |
| 			'-c',
 | |
| 			active_view.file_name(),
 | |
| 			'-R',
 | |
| 			alias
 | |
| 		], 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"))
 | |
| 
 | |
| 		response = []
 | |
| 		for line in iter(proc.stdout.readline, b''):
 | |
| 			response.append(line.rstrip())
 | |
| 
 | |
| 		active_window.status_message('')
 | |
| 
 | |
| 		status, endpoint, headers, body = response
 | |
| 
 | |
| 		status = status.decode('utf-8')
 | |
| 		endpoint = endpoint.decode('utf-8')
 | |
| 		headers = headers.decode('utf-8')
 | |
| 		body = body.decode('utf-8')
 | |
| 
 | |
| 		results_view = active_window.new_file()
 | |
| 		results_view.set_name('Results: ' + alias)
 | |
| 
 | |
| 		content = method + ' ' + endpoint + '\n'
 | |
| 		content += status + ' ' + responses[int(status)] + '\n\n'
 | |
| 		content += 'Response Headers: \n'
 | |
| 		content += self.autoindent(headers)
 | |
| 		content += '\n\nResponse Body: \n'
 | |
| 		content += self.autoindent(body)
 | |
| 
 | |
| 		results_view.run_command('insert_text', {'text': content})
 | |
| 		results_view.set_scratch(True)
 | |
| 		results_view.set_syntax_file(SYNTAX)
 | |
| 
 | |
| 	def autoindent(self, obj):
 | |
| 		parsed = json.loads(obj)
 | |
| 		return json.dumps(
 | |
| 			parsed,
 | |
| 			sort_keys=True,
 | |
| 			indent='\t',
 | |
| 			separators=(',', ': '),
 | |
| 			ensure_ascii=False
 | |
| 		)
 | |
| 
 | |
| 	def is_windows(self):
 | |
| 		return platform.system() == 'Windows'
 | |
| 
 |