RememberTheMilk客户端API和命令行客户端
项目描述
mekk.rtm提供RememberTheMilk客户端库(您可以使用它来编写使用相对简单API的客户端程序/库)以及一些命令行实用程序(您可以使用它们来管理数据,例如导入、导出、大量标记、在不同列表之间移动等)。
将mekk.rtm用作客户端库
与两个其他Python RememberTheMilk客户端(RtmAPI和pyrtm)不同,mekk.rtm试图提供详细、枚举的显式参数和结构化结果的API。它还使用一些单元测试进行了测试。
有关详细文档,请参阅mekk.rtm.RtmClient的联机文档。这里有一个简单的示例(有关更长的示例,请参阅包源中的sample/sample_client.py,要获取API密钥和共享密钥,请访问此页面)
from mekk.rtm import RtmClient, create_and_authorize_connector_prompting_for_api_key APP_NAME = "mekk.rtm sample" connector = create_and_authorize_connector_prompting_for_api_key(APP_NAME) # # Function above interactively prompts for api key and shared secret and # preserves acquired data in keyring. This is useful for testing, but in # normal case you are more likely to do: # # connector = create_and_authorize_connector(APP_NAME, API_KEY, SHARED_SECRET) client = RtmClient(connector) print "Normal lists: " for l in client.known_lists(): if not l.archived: print u"%s (%s)" % (l.id, l.name) print "Smart lists: " for l in client.known_smart_lists(): if not l.archived: print u"%s (%s, %s)" % (l.id, l.name, l.filter) test_list = client.find_or_create_list(u"The testing list") print "Test list: ", test_list another_list = client.find_or_create_list(u"The testing list") print "Another list: ", another_list task1 = client.create_task( u"Write some unit tests", list_id = test_list.id, tags = ["testy", "@dom"], priority = 3, due_date = "2010-11-30", estimate = "1 day 10 hours", repeat = "after 3 days", url = "http://en.wikipedia.org/wiki/Unit_testing", completed = False, notes = [ (u"Runner", u"Use nose to run them all\nIt is simplest"), (u"Helper", u"And mock can help to wrap backend apis\nwithout calling them") ]) print "Created task", task1 task2 = client.create_task( u"Less serious one", list_id = test_list.id) print "Created task", task2 task3 = client.create_task( u"Less serious one", list_id = another_list.id, tags = ["testy"]) print "Created task", task3 print "All incomplete tasks with notes on first list:" for t in client.find_tasks(list_id = test_list.id, filter = "status:incomplete and hasNotes:true"): print t task2 = client.update_task( task2.key, completed = True) print "Updated task", task2 print "All incomplete tasks tagged 'testy':" for t in client.find_tasks(filter = "tag:testy and status:incomplete"): print t
将mekk.rtm用作命令行工具
mekk.rtm提供一些命令行辅助工具(大多数与原始Web界面无法提供的事物相关)。
将许多任务移动到另一个列表(rtmmove)
将符合给定查询的所有任务移动到指定名称的列表中(如果不存在,将创建该列表)。
示例
rtmmove --list='Language learning' \ --filter='list:"English Course" or tag:"French" or tag:German"
要在实际执行之前验证命令的功能,可以添加< cite>–dry-run cite>和< cite>–verbose cite>。例如
rtmmove --list=Family \ --filter='(tag:paul or tag:jane) and status:"incomplete"' \ --dry-run --verbose
导出RememberTheMilk数据(rtmexport)
尚未实现(但计划很快实现)
导入导出的数据(rtmimport)
尚未实现(但计划很快实现)
从Nozbe导入数据到RememberTheMilk(rtmimport)
出于明显的原因(我已经导入了我的数据),我不会在每次发布时都测试此模块。在实际运行导入之前先进行试运行,如果出现问题请报告。
从Nozbe导出数据
准备Nozbe数据的< cite>.json cite>导出。有关详细信息,请参阅mekk.nozbe,但通常您只想
nozbetool export --user=MyNozbeName --json=mynozbedata.json
将数据导入RememberTheMilk
首先进行测试运行
rtmimport --nozbe-json=mynozbedata.json --verbose --dry-run
(它不会存储任何内容,只是打印出要执行的操作)并验证是否一切看起来正常。
然后进行实际导入
rtmimport --nozbe-json=mynozbedata.json --verbose
(或者如果您不想跟踪进度,可以省略< cite>–verbose cite>,但我建议您保留它)
注意:导入可能需要一些时间。在我的大列表和不太好的网络中,它已经运行了近一个小时。
数据是如何转换的
Nozbe项目以RememberTheMilk列表的形式保存。
Nozbe上下文被转换为RememberTheMilk标签。< cite>@ cite>被添加到它们的名字前面,并且非字母数字字符被替换为破折号(例如,< cite>My home/kitchen cite>变成< cite>@My-home-kitchen cite>)。
下一操作标记为< cite>Next cite>。
操作以任务的形式保存。名称、到期日期、 recurrence、估计成本和完成状态都保存。
在出现重复的情况下,RTM < span class="docutils literal">every span>模式被使用(因此标记为在Nozbe上每周重复的任务将在RTM中每年生成52次,无论用户是否完成它)。如果您更喜欢其他方式(在先前的实例完成时生成新的实例),请在导入后编辑任务,修补代码(将< cite>every cite>替换为< cite>after cite>),或向我请求命令行标志。
由于笔记与Nozbe上的项目相关联,以及与RememberTheMilk上的任务相关联,我通过创建名为“保存此笔记”的人工任务(每个适当的任务都有一个列表)并将笔记绑定到这些任务来保存笔记。必须稍后使用RTM接口来处理它,以确保这些任务被标记为立即到期。这些任务也标记为< cite>笔记 cite>。
限制
仅复制主上下文,其他上下文丢失。我不知道如何从Nozbe获取它们(如果有人知道如何修补mekk.nozbe以获取所有上下文,我可以轻松扩展此导入器以处理它们)。
根本不复制上传。我不知道如何从Nozbe导出它们,也不知道如何处理它们之后(RTM没有上传)。
在RememberTheMilk上不可用操作名称格式化,因此如果使用类似< cite>访问“网站”:http://google.com cite>的构造,它们将按原样显示。
共享信息(=关于委派给其他用户的信息)丢失。我没有使用此功能,因此我不知道底层数据看起来像什么。
一些上下文可能可以转换为位置而不是标签,但我不知道如何决定走哪条路。
问题和解决方案
如果导入过程被中断,重新运行将会产生重复任务(没有重复检查,这将非常耗时)。最好的解决办法是在文本编辑器中打开.json文件(在备份副本后)并简单地剪切掉所有已保存的操作(它们按顺序保存,所以只需定位到中断前最后保存的操作并剪切掉所有这些操作)。
感谢
我从Michael Grünewald的RtmAPI借鉴了许多想法(特别是如何处理授权和构造请求)。非常感谢他分享代码。
源代码、错误、补丁
开发跟踪在BitBucket上。从那里克隆,在那里报告错误,在那里提供补丁。