Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id DD13B431FC2 for ; Sun, 19 Feb 2012 16:26:39 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SQ85omdwlsoP for ; Sun, 19 Feb 2012 16:26:37 -0800 (PST) Received: from dmz-mailsec-scanner-1.mit.edu (DMZ-MAILSEC-SCANNER-1.MIT.EDU [18.9.25.12]) by olra.theworths.org (Postfix) with ESMTP id 59B33431FC0 for ; Sun, 19 Feb 2012 16:26:36 -0800 (PST) X-AuditID: 1209190c-b7fad6d000000920-ee-4f41933b7b1a Received: from mailhub-auth-1.mit.edu ( [18.9.21.35]) by dmz-mailsec-scanner-1.mit.edu (Symantec Messaging Gateway) with SMTP id BE.CF.02336.B33914F4; Sun, 19 Feb 2012 19:26:35 -0500 (EST) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-1.mit.edu (8.13.8/8.9.2) with ESMTP id q1K0QZLd016444; Sun, 19 Feb 2012 19:26:35 -0500 Received: from drake.mit.edu (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com [209.6.116.242]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q1K0QX8V000298 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Sun, 19 Feb 2012 19:26:34 -0500 (EST) Received: from amthrax by drake.mit.edu with local (Exim 4.77) (envelope-from ) id 1RzH5N-0001yC-8V; Sun, 19 Feb 2012 19:26:33 -0500 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH v2 1/8] Document the JSON schemata used by show and search Date: Sun, 19 Feb 2012 19:26:23 -0500 Message-Id: <1329697590-7404-2-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1329697590-7404-1-git-send-email-amdragon@mit.edu> References: <1329240823-7856-1-git-send-email-amdragon@mit.edu> <1329697590-7404-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrDIsWRmVeSWpSXmKPExsUixCmqrGs92dHf4GSvocX1mzOZLd6snMfq wORx+OtCFo9nq24xBzBFcdmkpOZklqUW6dslcGXs3rWfqWCFZsWGJW3MDYyL5LoYOTkkBEwk /v1cyghhi0lcuLeerYuRi0NIYB+jxOX2u8wQzgZGiXPvWqGc+0wSXx/8Y4Rw5jNKLNsxhQWk n01AQ2Lb/uVgs0QEpCV23p3NCmIzC1hJHL66CcwWFvCSmHlkOtAODg4WAVWJ1f06IGFeAXuJ 06d+Q52hIHFu9Tl2kBJOAQeJ1TtcQcJCAqUSR55sYZrAyL+AkWEVo2xKbpVubmJmTnFqsm5x cmJeXmqRrqFebmaJXmpK6SZGcCBJ8uxgfHNQ6RCjAAejEg+vVJmDvxBrYllxZe4hRkkOJiVR 3nWTHP2F+JLyUyozEosz4otKc1KLDzFKcDArifAusAfK8aYkVlalFuXDpKQ5WJTEeVW03vkJ CaQnlqRmp6YWpBbBZGU4OJQkeHeBDBUsSk1PrUjLzClBSDNxcIIM5wEaPhukhre4IDG3ODMd In+KUVFKnLceJCEAksgozYPrhUX6K0ZxoFeEeVeAVPEAkwRc9yugwUxAg3mF7EAGlyQipKQa GNu/b7WzTF33aH9Y3fWGnyJK1ebvyrqebQ7cb5TI9/p/xbK5O1Iv6M4qPsYsd2Nqi/D5eTdb sqTXyj08461lNo/73G7B7BsnzXp7Jbdee/Ph820D4a5nXs0PlvkeEJhRe3faD21/y8+FX2OL DRbwuc144LVHYmNAV0vd5QiRjTy6Eo1X9RVaM5VYijMSDbWYi4oTAekS3ijPAgAA Cc: tomi.ollila@iki.fi X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Feb 2012 00:26:40 -0000 --- devel/schemata | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ notmuch-search.c | 3 + notmuch-show.c | 2 + 3 files changed, 143 insertions(+), 0 deletions(-) create mode 100644 devel/schemata diff --git a/devel/schemata b/devel/schemata new file mode 100644 index 0000000..24ad775 --- /dev/null +++ b/devel/schemata @@ -0,0 +1,138 @@ +This file describes the schemata used for notmuch's structured output +format (currently JSON). + +[]'s indicate lists. List items can be marked with a '?', meaning +they are optional; or a '*', meaning there can be zero or more of that +item. {}'s indicate an object that maps from field identifiers to +values. An object field marked '?' is optional. |'s indicate +alternates (e.g., int|string means something can be an int or a +string). + +Common non-terminals +-------------------- + +# Number of seconds since the Epoch +unix_time = int + +# Thread ID, sans "thread:" +threadid = string + +# Message ID, sans "id:" +messageid = string + +notmuch show schema +------------------- + +# A top-level set of threads (do_show) +# Returned by notmuch show without a --part argument +thread_set = [thread*] + +# Top-level messages in a thread (show_messages) +thread = [thread_node*] + +# A message and its replies (show_messages) +thread_node = [ + message?, # present if --entire-thread or matched + [thread_node*] # children of message +] + +# A message (show_message) +message = { + # (format_message_json) + id: messageid, + match: bool, + filename: string, + timestamp: unix_time, # date header as unix time + date_relative: string, # user-friendly timestamp + tags: [string*], + + headers: headers, + body: [part] +} + +# A MIME part (show_message_body) +part = { + # format_part_start_json + id: int|string, # part id (currently DFS part number) + + # format_part_encstatus_json + encstatus?: encstatus, + + # format_part_sigstatus_json + sigstatus?: sigstatus, + + # format_part_content_json + content-type: string, + content-id?: string, + # if content-type starts with "multipart/": + content: [part*], + # if content-type is "message/rfc822": + content: [{headers: headers, body: [part]}], + # otherwise (leaf parts): + filename?: string, + content-charset?: string, + # A leaf part's body content is optional, but may be included if + # it can be correctly encoded as a string. Consumers should use + # this in preference to fetching the part content separately. + content?: string +} + +# The headers of a message (format_headers_json with raw headers) or +# a part (format_headers_message_part_json with pretty-printed headers) +headers = { + Subject: string, + From: string, + To?: string, + Cc?: string, + Bcc?: string, + Date: string +} + +# Encryption status (format_part_encstatus_json) +encstatus = [{status: "good"|"bad"}] + +# Signature status (format_part_sigstatus_json) +sigstatus = [signature*] + +signature = { + # signature_status_to_string + status: "none"|"good"|"bad"|"error"|"unknown", + # if status is "good": + fingerprint?: string, + created?: unix_time, + expires?: unix_time, + userid?: string + # if status is not "good": + keyid?: string + # if the signature has errors: + errors?: int +} + +notmuch search schema +--------------------- + +# --output=summary +summary = [thread*] + +# --output=threads +threads = [threadid*] + +# --output=messages +messages = [messageid*] + +# --output=files +files = [string*] + +# --output=tags +tags = [string*] + +thread = { + thread: threadid, + timestamp: unix_time, + date_relative: string, # user-friendly timestamp + matched: int, # number of matched messages + total: int, # total messages in thread + authors: string, # comma-separated names with | between + # matched and unmatched + subject: string +} diff --git a/notmuch-search.c b/notmuch-search.c index d504051..92ce38a 100644 --- a/notmuch-search.c +++ b/notmuch-search.c @@ -90,6 +90,9 @@ format_thread_json (const void *ctx, const int total, const char *authors, const char *subject); + +/* Any changes to the JSON format should be reflected in the file + * devel/schemata. */ static const search_format_t format_json = { "[", "{", diff --git a/notmuch-show.c b/notmuch-show.c index d930f94..93fb16f 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -65,6 +65,8 @@ format_part_content_json (GMimeObject *part); static void format_part_end_json (GMimeObject *part); +/* Any changes to the JSON format should be reflected in the file + * devel/schemata. */ static const notmuch_show_format_t format_json = { "[", NULL, "{", format_message_json, -- 1.7.7.3