在上一篇里分析了列出和显示gist的功能。
在一篇主要分析下创建、更新、删除gist的功能。
并用一个简单的示例来创建gist。
创建gist
先以”Gist Description (optional):”关键字为线索
在GistCommand类中找到
分析流程
- 先找选择的区域,
- 找出内容
- 输入描述
- 输入文件名
- 调用create_gist
- create_gist中生成相应的json
- 调用api_request
- 上传内容
作者的代码在处理的时候,考虑到了多个区间文件被选中,多个文件被选中等多种情况。
考虑用户输入的多种情况,给了默认描述,默认文件名。
但我先关注简单的一个文件的方式。
浓缩流程的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import sublime import sublime_plugin import contextlib import json import urllib.request as urllib
class ExampleCommand(sublime_plugin.TextCommand): def run(self, edit): selectRegions = self.view.sel() selectText = self.view.substr(selectRegions[0]) if len(selectText)==0: selectText = self.view.substr(sublime.Region(0, self.view.size())) window = self.view.window() def on_gist_description(description): print(description) def on_gist_fileanme(filename): filedata = {filename:{'content':selectText}} post_data = json.dumps({'description': description, 'public':'true', 'files':filedata}) token ='xxx' rq = urllib.Request('https://api.github.com/gists') rq.add_header('Authorization', 'token ' + token) rq.add_data(bytes(post_data.encode('utf8'))) with contextlib.closing(urllib.urlopen(rq)) as response: gistjson = json.loads(response.read().decode('utf8', 'ignore'))
print(gistjson)
window.show_input_panel("Input Filename:", '', on_gist_fileanme, None, None) window.show_input_panel("Input Description:", '', on_gist_description, None, None)
|
更新和删除gist
更新和创建差不多
重要的是要知道更新的哪一个文件,文件的相关信息是什么。
self.view.settings().get(‘xx’)这种方式来得到文件的相关信息
封装在GistViewCommand中
有文件的相关信息,就使用api进行更新和删除
错误处理
错误处理都是在catch_errors中完成了
对要进行异常捕获的前面加上@catch_errors
这是用的python的装饰模式
可以参见http://coolshell.cn/articles/11265.html
catch_errors中完成了
对参数未配置进行提醒
用的sublime.error_message
在这次看源码的过程中学到了什么
主要有两方面
第一方面对sublime插件api熟悉
第二方面对python的语法运用有了更进一步的理解
比如
- 字典的的使用
- 优雅的json的处理方式
- lambda表达式的使用
- python的装饰器
- 函数嵌套
- 用lib库进行http请求(之前都是用的requests库)
- 代码结构的组织