跳转到主要内容

RememberTheMilk客户端API和命令行客户端

项目描述

mekk.rtm提供RememberTheMilk客户端库(您可以使用它来编写使用相对简单API的客户端程序/库)以及一些命令行实用程序(您可以使用它们来管理数据,例如导入、导出、大量标记、在不同列表之间移动等)。

将mekk.rtm用作客户端库

与两个其他Python RememberTheMilk客户端(RtmAPIpyrtm)不同,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界面无法提供的事物相关)。

更新许多任务的标签(rtmtag

该命令允许一次添加和/或删除多个任务的具体标签。示例用法

rtmtag --add=work --add=computer \
       --remove=office \
       --filter='list:"Prepared Reports" and status:"incomplete"'

(每个< cite>-add名称标签用于添加,每个< cite>–remove名称标签用于删除,< cite>–filter定义了使用常规RememberTheMilk查询语法要更新的任务。

要在实际执行之前验证命令的功能,可以添加< cite>–dry-run和< cite>–verbose。例如

rtmtag --add=rodzina  \
       --filter='list:"Rodzina" and status:"incomplete"' \
       --dry-run --verbose

将许多任务移动到另一个列表(rtmmove

将符合给定查询的所有任务移动到指定名称的列表中(如果不存在,将创建该列表)。

示例

rtmmove --list='Language learning' \
        --filter='list:"English Course" or tag:"French" or tag:German"

要在实际执行之前验证命令的功能,可以添加< cite>–dry-run和< cite>–verbose。例如

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导出。有关详细信息,请参阅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,但我建议您保留它)

注意:导入可能需要一些时间。在我的大列表和不太好的网络中,它已经运行了近一个小时。

数据是如何转换的

Nozbe项目以RememberTheMilk列表的形式保存。

Nozbe上下文被转换为RememberTheMilk标签。< cite>@被添加到它们的名字前面,并且非字母数字字符被替换为破折号(例如,< cite>My home/kitchen变成< cite>@My-home-kitchen)。

下一操作标记为< cite>Next

操作以任务的形式保存。名称、到期日期、 recurrence、估计成本和完成状态都保存。

在出现重复的情况下,RTM < span class="docutils literal">every模式被使用(因此标记为在Nozbe上每周重复的任务将在RTM中每年生成52次,无论用户是否完成它)。如果您更喜欢其他方式(在先前的实例完成时生成新的实例),请在导入后编辑任务,修补代码(将< cite>every替换为< cite>after),或向我请求命令行标志。

由于笔记与Nozbe上的项目相关联,以及与RememberTheMilk上的任务相关联,我通过创建名为“保存此笔记”的人工任务(每个适当的任务都有一个列表)并将笔记绑定到这些任务来保存笔记。必须稍后使用RTM接口来处理它,以确保这些任务被标记为立即到期。这些任务也标记为< cite>笔记

限制

仅复制主上下文,其他上下文丢失。我不知道如何从Nozbe获取它们(如果有人知道如何修补mekk.nozbe以获取所有上下文,我可以轻松扩展此导入器以处理它们)。

根本不复制上传。我不知道如何从Nozbe导出它们,也不知道如何处理它们之后(RTM没有上传)。

在RememberTheMilk上不可用操作名称格式化,因此如果使用类似< cite>访问“网站”:http://google.com的构造,它们将按原样显示。

共享信息(=关于委派给其他用户的信息)丢失。我没有使用此功能,因此我不知道底层数据看起来像什么。

一些上下文可能可以转换为位置而不是标签,但我不知道如何决定走哪条路。

问题和解决方案

如果导入过程被中断,重新运行将会产生重复任务(没有重复检查,这将非常耗时)。最好的解决办法是在文本编辑器中打开.json文件(在备份副本后)并简单地剪切掉所有已保存的操作(它们按顺序保存,所以只需定位到中断前最后保存的操作并剪切掉所有这些操作)。

感谢

我从Michael Grünewald的RtmAPI借鉴了许多想法(特别是如何处理授权和构造请求)。非常感谢他分享代码。

源代码、错误、补丁

开发跟踪在BitBucket上。从那里克隆,在那里报告错误,在那里提供补丁。

项目详情


由以下支持