From 6663067a60deb40545840b86f2ff54d19404383f Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Fri, 2 Jan 2015 18:17:07 -0500 Subject: Trailing whitespace --- sx-tag.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 82f7ddb..511c474 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -26,7 +26,7 @@ ;;; Getting the list from a site -(defvar sx-tag-filter '((tag.name)) +(defvar sx-tag-filter '((tag.name)) "Filter used when querying tags.") (defun sx-tag--get-some-tags-containing (site string) @@ -52,7 +52,7 @@ TAGS can be a string (the tag name) or a list of strings. Fails if TAGS is a list with more than 100 items. Return the list of invalid tags in TAGS." (and (listp tags) (> (length tags) 100) - (error "Invalid argument. TAG has more than 100 items")) + (error "Invalid argument. TAG has more than 100 items")) (let ((result (mapcar (lambda (x) (cdr (assoc 'name x))) -- cgit v1.2.3 From 48273879d34d6027d9edd623e9f946ef819d363e Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Fri, 2 Jan 2015 19:30:37 -0500 Subject: Fix sx-tag-filter It wasn't returning any .items because it wasn't included in the filter. This commit also introduces a convenience macro in sx-filter to avoid this scenario in the future. --- sx-filter.el | 35 ++++++++++++++++++++++++++++++++++- sx-tag.el | 4 +++- 2 files changed, 37 insertions(+), 2 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-filter.el b/sx-filter.el index 8c00c12..ad37e67 100644 --- a/sx-filter.el +++ b/sx-filter.el @@ -41,7 +41,40 @@ Structure: ...)") -;;; Compilation +;;; Creation + +(defmacro sx-filter-from-nil (included) + "Creates a filter data structure with INCLUDED fields. +All wrapper fields are included by default." + ;; @OTODO: it would be neat to have syntax like + ;; + ;; (field-a + ;; field-b + ;; (object-a subfield) + ;; field-c + ;; (object-b subfield-a subfield-b)) + ;; + ;; expand into + ;; + ;; (field-a + ;; field-b + ;; object-a.subfield + ;; field-c + ;; object-b.subfield-a object-b.subfield-b) + `(quote ((,@included + .backoff + .error_id + .error_message + .error_name + .has_more + .items + .page + .page_size + .quota_max + .quota_remaining + .total + .type) + nil none))) ;;; @TODO allow BASE to be a precompiled filter name (defun sx-filter-compile (&optional include exclude base) diff --git a/sx-tag.el b/sx-tag.el index 511c474..9f8a5a9 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -26,7 +26,9 @@ ;;; Getting the list from a site -(defvar sx-tag-filter '((tag.name)) +(defvar sx-tag-filter + (sx-filter-from-nil + (tag.name)) "Filter used when querying tags.") (defun sx-tag--get-some-tags-containing (site string) -- cgit v1.2.3 From 53e46a228fe78382f053cd9764b59a45ab095efb Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Fri, 2 Jan 2015 19:32:38 -0500 Subject: Implement sx-tag--get-all --- sx-tag.el | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 9f8a5a9..0aec814 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -31,6 +31,13 @@ (tag.name)) "Filter used when querying tags.") +(defun sx-tag--get-all (site) + "Retrieve all tags for SITE." + (sx-method-call 'tags + :get-all t + :filter sx-tag-filter + :site "emacs")) + (defun sx-tag--get-some-tags-containing (site string) "Return at most 100 tags for SITE containing STRING. Returns an array." -- cgit v1.2.3 From 34f24c86576be0f72cbb173d66228bcfe97b6491 Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Fri, 2 Jan 2015 19:55:23 -0500 Subject: Hotfix oversight --- sx-tag.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 0aec814..1418f1c 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -36,7 +36,7 @@ (sx-method-call 'tags :get-all t :filter sx-tag-filter - :site "emacs")) + :site site)) (defun sx-tag--get-some-tags-containing (site string) "Return at most 100 tags for SITE containing STRING. -- cgit v1.2.3 From 4159d251131efffa9e217ec5a5cc5744ede70ca5 Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Fri, 2 Jan 2015 22:13:47 -0500 Subject: Grab as many tags at a time as possible This might need to be refactored into :get-all or request-all. --- sx-tag.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 1418f1c..37a3fd3 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -36,7 +36,8 @@ (sx-method-call 'tags :get-all t :filter sx-tag-filter - :site site)) + :site site + :keywords '((pagesize . 100)))) (defun sx-tag--get-some-tags-containing (site string) "Return at most 100 tags for SITE containing STRING. -- cgit v1.2.3 From 4e214c5d399011d35878bf82d25f8263284efd10 Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Fri, 2 Jan 2015 22:21:32 -0500 Subject: Fix sx-tag--get-all Instead of returning (((name . "tag")) ((name . "tag"))), return ("tag" "tag") --- sx-tag.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 37a3fd3..e9d3f4f 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -33,11 +33,14 @@ (defun sx-tag--get-all (site) "Retrieve all tags for SITE." - (sx-method-call 'tags - :get-all t - :filter sx-tag-filter - :site site - :keywords '((pagesize . 100)))) + (mapcar + (lambda (tag) + (cdr (assoc 'name tag))) + (sx-method-call 'tags + :get-all t + :filter sx-tag-filter + :site site + :keywords '((pagesize . 100))))) (defun sx-tag--get-some-tags-containing (site string) "Return at most 100 tags for SITE containing STRING. -- cgit v1.2.3 From eeb327e3af94e1118218c129916b8f7165e835ef Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Sat, 3 Jan 2015 22:51:45 -0500 Subject: Introduce :page and :pagesize into sx-method-call Default page size is 100 to reduce number of overall requests made. Fixes #190. --- sx-method.el | 6 ++++++ sx-site.el | 2 +- sx-tag.el | 8 +++----- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-method.el b/sx-method.el index 64dbc1f..e0764fb 100644 --- a/sx-method.el +++ b/sx-method.el @@ -35,6 +35,8 @@ (cl-defun sx-method-call (method &key id submethod keywords + page + (pagesize 100) (filter '(())) auth (url-method "GET") @@ -55,6 +57,8 @@ authentication. :SITE is the api parameter specifying the site. :GET-ALL is nil or non-nil :PROCESS-FUNCTION is a response-processing function +:PAGE is the page number which will be requested +:PAGESIZE is the number of items to retrieve per request, default 100 When AUTH is nil, it is assumed that no auth-requiring filters or methods will be used. If they are an error will be signaled. This is @@ -123,6 +127,8 @@ Return the entire response as a complex alist." (error "This request requires authentication.")))) ;; Concatenate all parameters now that filter is ensured. (push `(filter . ,(sx-filter-get-var filter)) keywords) + (push `(page . ,page) keywords) + (push `(pagesize . ,pagesize) keywords) (when site (push `(site . ,site) keywords)) (funcall call diff --git a/sx-site.el b/sx-site.el index 8bd4fc0..1402bb9 100644 --- a/sx-site.el +++ b/sx-site.el @@ -49,7 +49,7 @@ (sx-cache-get 'site-list '(sx-method-call 'sites - :keywords '((pagesize . 999)) + :pagesize 999 :filter sx-site-browse-filter))) (defcustom sx-site-favorites diff --git a/sx-tag.el b/sx-tag.el index e9d3f4f..07b7a77 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -39,8 +39,7 @@ (sx-method-call 'tags :get-all t :filter sx-tag-filter - :site site - :keywords '((pagesize . 100))))) + :site site))) (defun sx-tag--get-some-tags-containing (site string) "Return at most 100 tags for SITE containing STRING. @@ -49,7 +48,7 @@ Returns an array." :auth nil :filter sx-tag-filter :site site - :keywords `((page . 1) (pagesize . 100) (inname . ,string)))) + :keywords `((inname . ,string)))) (defun sx-tag--get-some-tag-names-containing (site string) "Return at most 100 tag names for SITE containing STRING. @@ -74,8 +73,7 @@ Return the list of invalid tags in TAGS." :submethod 'info :auth nil :filter sx-tag-filter - :site site - :keywords '((page . 1) (pagesize . 100)))))) + :site site)))) (cl-remove-if (lambda (x) (member x result)) tags))) (provide 'sx-tag) -- cgit v1.2.3 From e6c5b821b1c13ec0125e2a305f121e763a79ddfc Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Sun, 4 Jan 2015 13:16:42 -0200 Subject: sx-tag--get-all also retrieves synonyms --- sx-tag.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 07b7a77..8c468a6 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -28,18 +28,24 @@ ;;; Getting the list from a site (defvar sx-tag-filter (sx-filter-from-nil - (tag.name)) + (tag.name + tag.synonyms)) "Filter used when querying tags.") -(defun sx-tag--get-all (site) - "Retrieve all tags for SITE." - (mapcar - (lambda (tag) - (cdr (assoc 'name tag))) +(defun sx-tag--get-all (site &optional no-synonyms) + "Retrieve all tags for SITE. +If NO-SYNONYMS is non-nil, don't return synonyms." + (cl-reduce + (lambda (so-far tag) + (let-alist tag + (cons .name + (if no-synonyms so-far + (append .synonyms so-far))))) (sx-method-call 'tags :get-all t :filter sx-tag-filter - :site site))) + :site site) + :initial-value nil)) (defun sx-tag--get-some-tags-containing (site string) "Return at most 100 tags for SITE containing STRING. -- cgit v1.2.3