From c487024e26defbf8325f820cfd29184146eeaf70 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Mon, 1 Sep 2014 12:46:08 +0200 Subject: Add some pivotal functions --- emacs/.emacs.d/site-lisp/pivot.el | 77 ++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 17 deletions(-) (limited to 'emacs/.emacs.d/site-lisp/pivot.el') diff --git a/emacs/.emacs.d/site-lisp/pivot.el b/emacs/.emacs.d/site-lisp/pivot.el index 63830ab..b184a88 100644 --- a/emacs/.emacs.d/site-lisp/pivot.el +++ b/emacs/.emacs.d/site-lisp/pivot.el @@ -43,28 +43,71 @@ and story data via the API, and needs to be kept private." Does not need a final `/'.") +(defvar pivotel-user-id nil + "The user id of the current user.") +(defvar pivotel-projects nil + "The projects from the current user.") + +(defmacro with-pivotel-headers (headers &rest body) + "Add `X-TrackerTocken' to HEADERS and bind them around BODY." + (declare (indent 1)) + `(let ((url-request-extra-headers + (append (list (cons "X-TrackerToken" pivotel-api-token)) + ,headers))) + ,@body)) + +(defun pivotel--retrieve-from (url) + "Retrieve data from URL." + (with-current-buffer + (url-retrieve-synchronously (concat pivotel-api-url url)) + (goto-char (point-min)) + (search-forward "\n\n") + (let ((results (json-read))) + (kill-buffer) + results))) + (defun pivotel-get-story (project story) "Get data from PROJECT for STORY." - (let ((url-request-extra-headers - `(("X-TrackerToken" . ,pivotel-api-token)))) - (with-current-buffer - (url-retrieve-synchronously - (format "%s/projects/%d/stories/%d" - pivotel-api-url project story)) - (goto-char (point-min)) - (search-forward "\n\n") - (json-read)))) + (with-pivotel-headers nil + (pivotel--retrieve-from + (format "/projects/%d/stories/%d" project story)))) (defun pivotel-get-projects () "Get a list of all projects." - (let ((url-request-extra-headers - `(("X-TrackerTocken" . ,pivotel-api-token)))) - (with-current-buffer - (url-retrieve-synchronously - (format "%s/projects" pivotel-api-url)) - (goto-char (point-min)) - (search-forward "\n\n") - (json-read)))) + (or pivotel-projects + (setq pivotel-projects + (with-pivotel-headers nil + (pivotel--retrieve-from "/projects"))))) + +(defun pivotel-get-stories (project) + "Get a list of all stories in PROJECT." + (with-pivotel-headers nil + (pivotel--retrieve-from (format "/projects/%d/stories" project)))) + +(defun pivotel-get-me () + "Get information about currently logged-in user." + (with-pivotel-headers nil (pivotel--retrieve-from "/me"))) + +(defun pivotel-get-me-id () + "Get and cache the current user's id." + (or pivotel-user-id + (setq pivotel-user-id + (cdr (assoc 'id (pivotel-get-me)))))) + +(defun pivotel-get-all-stories () + "Get all stories for the current user." + (let ((project-ids (mapcar (lambda (itm) (cdr (assoc 'id itm))) + (pivotel-get-projects)))) + (mapcar #'pivotel-get-stories project-ids))) + +(defun pivotel-get-my-owned-stories () + "Get the stories for which the user is an owner." + (let ((stories (pivotel-get-all-stories)) + (id (pivotel-get-me-id))) + (delq nil + (mapcar (lambda (itm) + (when (= (cdr (assoc 'owned_by_id itm)) id) itm)) + stories)))) (provide 'pivot) ;;; pivot.el ends here -- cgit v1.2.3-54-g00ecf