emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals-release/plz 9b681d4893 3/3: Merge: v0.8


From: ELPA Syncer
Subject: [elpa] externals-release/plz 9b681d4893 3/3: Merge: v0.8
Date: Thu, 25 Apr 2024 21:58:35 -0400 (EDT)

branch: externals-release/plz
commit 9b681d48933f288a6ae4ec92ca4bc03792a3fe9f
Merge: 1b66fa907d 57f1048265
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>

    Merge: v0.8
---
 .github/workflows/test.yml |   7 +-
 README.org                 |   9 ++
 plz.el                     |  32 ++++---
 tests/test-plz.el          | 216 ++++++++++++++++++++++-----------------------
 4 files changed, 140 insertions(+), 124 deletions(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 3c38eac865..0f991e4057 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -41,7 +41,12 @@ jobs:
       fail-fast: false
       matrix:
         emacs_version:
-          - 26.3
+          # FIXME: The 26.3 test fails to initialize with the error
+          # "Package ‘emacs-27.1’ is unavailable", which happens just
+          # after "Package refresh done".  Not sure what the cause is.
+          # But I don't want the whole suite marked as failing because
+          # of 26.3 right now, so commenting it out.
+          # - 26.3
           - 27.1
           - 27.2
           - 28.1
diff --git a/README.org b/README.org
index 0b6285cb5a..d3d27d948c 100644
--- a/README.org
+++ b/README.org
@@ -142,6 +142,9 @@ Synchronously download a JPEG file, then create an Emacs 
image object from the d
 
    ~NOQUERY~ is passed to ~make-process~, which see.
 
+   ~FILTER~ is an optional function to be used as the process filter for the 
curl process.  It can be used to handle HTTP responses in a streaming way.  The 
function must accept 2 arguments, the process object running curl, and a string 
which is output received from the process.  The default process filter inserts 
the output of the process into the process buffer.  The provided ~FILTER~ 
function should at least insert output up to the HTTP body into the process 
buffer.
+
+
 ** Queueing
 
 ~plz~ provides a simple system for queueing HTTP requests.  First, make a 
~plz-queue~ struct by calling ~make-plz-queue~.  Then call ~plz-queue~ with the 
struct as the first argument, and the rest of the arguments being the same as 
those passed to ~plz~.  Then call ~plz-run~ to run the queued requests.
@@ -185,6 +188,12 @@ You may also clear a queue with ~plz-clear~, which cancels 
any active or queued
 :TOC:      :depth 0
 :END:
 
+** 0.8
+
+*Additions*
+
++ Function ~plz~ now accepts a ~:filter~ argument which can be used to 
override the default process filter (e.g. for streaming responses).  
([[https://github.com/alphapapa/plz.el/pull/43][#43]], 
[[https://github.com/alphapapa/plz.el/pull/50][#50]].  Thanks to 
[[https://github.com/r0man][Roman Scherer]].)
+
 ** 0.7.3
 
 *Fixes*
diff --git a/plz.el b/plz.el
index 75281bb88a..57e247f815 100644
--- a/plz.el
+++ b/plz.el
@@ -5,7 +5,7 @@
 ;; Author: Adam Porter <adam@alphapapa.net>
 ;; Maintainer: Adam Porter <adam@alphapapa.net>
 ;; URL: https://github.com/alphapapa/plz.el
-;; Version: 0.7.3
+;; Version: 0.8
 ;; Package-Requires: ((emacs "26.3"))
 ;; Keywords: comm, network, http
 
@@ -254,7 +254,7 @@ connection phase and waiting to receive the response (the
 
 ;;;;; Public
 
-(cl-defun plz (method url &rest rest &key headers body else finally noquery
+(cl-defun plz (method url &rest rest &key headers body else filter finally 
noquery
                       (as 'string) (then 'sync)
                       (body-type 'text) (decode t decode-s)
                       (connect-timeout plz-connect-timeout) (timeout 
plz-timeout))
@@ -330,6 +330,15 @@ from a host, respectively.
 
 NOQUERY is passed to `make-process', which see.
 
+FILTER is an optional function to be used as the process filter
+for the curl process.  It can be used to handle HTTP responses in
+a streaming way.  The function must accept 2 arguments, the
+process object running curl, and a string which is output
+received from the process.  The default process filter inserts
+the output of the process into the process buffer.  The provided
+FILTER function should at least insert output up to the HTTP body
+into the process buffer.
+
 \(To silence checkdoc, we mention the internal argument REST.)"
   ;; FIXME(v0.8): Remove the note about error changes from the docstring.
   ;; FIXME(v0.8): Update error signals in docstring.
@@ -390,10 +399,10 @@ NOQUERY is passed to `make-process', which see.
                    ('binary nil)
                    (_ decode)))
          (default-directory
-           ;; Avoid making process in a nonexistent directory (in case the 
current
-           ;; default-directory has since been removed).  It's unclear what 
the best
-           ;; directory is, but this seems to make sense, and it should still 
exist.
-           temporary-file-directory)
+          ;; Avoid making process in a nonexistent directory (in case the 
current
+          ;; default-directory has since been removed).  It's unclear what the 
best
+          ;; directory is, but this seems to make sense, and it should still 
exist.
+          temporary-file-directory)
          (process-buffer (generate-new-buffer " *plz-request-curl*"))
          (stderr-process (make-pipe-process :name "plz-request-curl-stderr"
                                             :buffer (generate-new-buffer " 
*plz-request-curl-stderr*")
@@ -404,6 +413,7 @@ NOQUERY is passed to `make-process', which see.
                                 :coding 'binary
                                 :command (append (list plz-curl-program) 
curl-command-line-args)
                                 :connection-type 'pipe
+                                :filter filter
                                 :sentinel #'plz--sentinel
                                 :stderr stderr-process
                                 :noquery noquery))
@@ -635,11 +645,11 @@ making QUEUE's requests."
 Return when QUEUE is at limit or has no more queued requests.
 
 QUEUE should be a `plz-queue' structure."
-  (cl-labels ((readyp
-               (queue) (and (not (plz-queue-canceled-p queue))
-                            (plz-queue-requests queue)
-                            ;; With apologies to skeeto...
-                            (< (length (plz-queue-active queue)) 
(plz-queue-limit queue)))))
+  (cl-labels ((readyp (queue)
+                (and (not (plz-queue-canceled-p queue))
+                     (plz-queue-requests queue)
+                     ;; With apologies to skeeto...
+                     (< (length (plz-queue-active queue)) (plz-queue-limit 
queue)))))
     (while (readyp queue)
       (pcase-let* ((request (plz--queue-pop queue))
                    ((cl-struct plz-queued-request method url
diff --git a/tests/test-plz.el b/tests/test-plz.el
index 3f5f0a85f1..8725b9e4dc 100644
--- a/tests/test-plz.el
+++ b/tests/test-plz.el
@@ -1,6 +1,6 @@
 ;;; test-plz.el --- Tests for plz          -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2019-2022  Free Software Foundation, Inc.
+;; Copyright (C) 2019-2023  Free Software Foundation, Inc.
 
 ;; Author: Adam Porter <adam@alphapapa.net>
 ;; Maintainer: Adam Porter <adam@alphapapa.net>
@@ -24,67 +24,14 @@
 
 ;;; Commentary:
 
-;; NOTE: NOTE: NOTE: NOTE: Yes, four NOTEs, because this is important:
-;; As of this moment, all of the tests pass when run with makem.sh.
-;; And when running them in an interactive Emacs with ERT, one test at
-;; a time, individual tests pass, or almost always do (depending on
-;; whether the httpbin.org server is overloaded).  But when running
-;; multiple tests in ERT at one time,
-;; i.e. (ert-run-tests-interactively "plz-"), multiple, if not most,
-;; tests fail, but not the same ones every time.
-
-;; I have now spent hours trying to figure out why, inserting many
-;; debug statements in many functions, and come up with nothing.  I
-;; tried changing the way `accept-process-output' is called, like
-;; using timeouts or JUST-THIS-ONE, but it made no difference.  I
-;; tried calling it extra times, nope.  I tried calling the sentinel
-;; extra times when it seemed that it hadn't run the THEN function,
-;; nope.  Nothing seems to make a difference.
-
-;; I even checked out an earlier commit, before the commit that
-;; rewrote/merged the synchronous request code into the `plz'
-;; function, thinking that surely I broke something--but, nope, they
-;; apparently failed the same way back then: passing with makem.sh,
-;; passing individually, but failing when run in close succession by
-;; ERT.
-
-;; After inserting enough debug statements, I noticed that the process
-;; sentinel sometimes seemed to run for the last time after the ERT
-;; test had returned, which suggests that ERT might be doing something
-;; weird, or somehow its instrumentation interferes with the
-;; process-handling code.  But if that's not the cause, then I'm out
-;; of ideas.
-
-;; So then I tried rewriting the synchronous request code to use
-;; `call-process-region', instead of calling `accept-process-output'
-;; in a loop to block on the curl process (which is how the Elisp
-;; manual says to do it), but that still made no difference: even the
-;; async requests fail in the same way with ERT.  So that doesn't
-;; appear to be the problem, either.
-
-;; So is there some kind of fundamental flaw in the `plz' design?
-;; Maybe.  Is there a simple, logical oversight in its code that only
-;; manifests under certain conditions?  Maybe.  Is ERT doing something
-;; weird that's interfering with process-related code?  Maybe.  Is
-;; Emacs's own process-handling code still broken in some mysterious
-;; way?  Maybe.
-
-;; But despite all of that, when using `plz' "in anger", in `ement',
-;; it seems to work reliably for me.  I did get one report from one
-;; user that sounded like the same kind of problem I'm seeing with ERT
-;; here, but then he tried `ement-connect' again, and it worked.  And
-;; I'm sitting here watching `ement' constantly using `plz' to talk to
-;; the matrix.org server, and I haven't had a single error or failure,
-;; even after hours of being connected.  It *seems* to *actually*
-;; work.
-
-;; So, if you're reading this, and you're wondering whether you should
-;; use `plz': Well, please do, and please let me know if you have any
-;; problems; I do need to know whether it's working for other users.
-;; And if you think you might know what's going wrong when running the
-;; tests in ERT, please let me know, because I'm out of ideas: as far
-;; as I can tell, when it comes to process-handling in Emacs, "there
-;; be dragons."
+;; This file implements tests for `plz'.  By default, the requests are
+;; made to "localhost", expecting an instance of httpbin
+;; <https://github.com/postmanlabs/httpbin> running on port 80; it's
+;; convenient to use the Docker image "kennethreitz/httpbin".  By
+;; changing the variable `plz-test-uri-prefix', the tests can be run
+;; against other URLs, such as <https://httpbin.org> (but that server
+;; is often overloaded, making for unreliable tests, so a local
+;; instance is preferred).
 
 ;;; Code:
 
@@ -127,7 +74,11 @@ If running httpbin locally, set to \"http://localhost\".";)
              do (sleep-for seconds))))
 
 (cl-defmacro plz-deftest (name () &body docstring-keys-and-body)
-  "Like `ert-deftest', but defines tests for both HTTP/1.1 and HTTP/2."
+  "Like `ert-deftest', but defines tests for both HTTP/1.1 and HTTP/2.
+Also defines local function `url' which returns its argument
+appended to `plz-test-uri-prefix' (and any instance of
+\"URI-PREFIX\" in URL-PART is replaced with `plz-test-uri-prefix'
+in URL-encoded form)."
   (declare (debug (&define [&name "test@" symbolp]
                           sexp [&optional stringp]
                           [&rest keywordp sexp] def-body))
@@ -139,18 +90,15 @@ If running httpbin locally, set to \"http://localhost\".";)
                           `(ert-deftest ,name ()
                              (let ((plz-curl-default-args
                                     ',(append plz-curl-default-args (list 
(format "--http%s" http-version)))))
-                               ,@docstring-keys-and-body))))))
+                               (cl-labels ((url (part)
+                                             (setf part 
(replace-regexp-in-string
+                                                         "URI-PREFIX" 
(url-hexify-string plz-test-uri-prefix)
+                                                         part t t))
+                                             (concat plz-test-uri-prefix 
part)))
+                                 ,@docstring-keys-and-body)))))))
 
 ;;;; Functions
 
-(defun plz-test-url (url-part)
-  "Return URL-PART appended to `plz-test-uri-prefix'.
-Also, any instance of \"URI-PREFIX\" in URL-PART is replaced with
-`plz-test-uri-prefix' in URL-encoded form."
-  (setf url-part (replace-regexp-in-string "URI-PREFIX" (url-hexify-string 
plz-test-uri-prefix)
-                                           url-part t t))
-  (concat plz-test-uri-prefix url-part))
-
 (defmacro plz-test-get-response (response)
   "Test parts of RESPONSE with `should'."
   `(progn
@@ -168,7 +116,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-string nil
   (let* ((test-string)
-         (process (plz 'get (plz-test-url "/get")
+         (process (plz 'get (url "/get")
                     :as 'string
                     :then (lambda (string)
                             (setf test-string string)))))
@@ -177,7 +125,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-buffer nil
   (let* ((result-buffer)
-         (process (plz 'get (plz-test-url "/get")
+         (process (plz 'get (url "/get")
                     :as 'buffer :then (lambda (buffer)
                                         (setf result-buffer buffer)))))
     (unwind-protect
@@ -192,7 +140,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-response nil
   (let* ((test-response)
-         (process (plz 'get (plz-test-url "/get")
+         (process (plz 'get (url "/get")
                     :as 'response
                     :then (lambda (response)
                             (setf test-response response)))))
@@ -201,7 +149,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-json nil
   (let* ((test-json)
-         (process (plz 'get (plz-test-url "/get")
+         (process (plz 'get (url "/get")
                     :as #'json-read
                     :then (lambda (json)
                             (setf test-json json)))))
@@ -212,7 +160,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 (plz-deftest plz-post-json-string nil
   (let* ((json-string (json-encode (list (cons "key" "value"))))
          (response-json)
-         (process (plz 'post (plz-test-url "/post")
+         (process (plz 'post (url "/post")
                     :headers '(("Content-Type" . "application/json"))
                     :body json-string
                     :as #'json-read
@@ -224,13 +172,13 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
       (should (string= "value" (alist-get 'key (json-read-from-string 
.data)))))))
 
 (plz-deftest plz-post-jpeg-string nil
-  (let* ((jpeg-to-upload (plz 'get (plz-test-url "/image/jpeg")
+  (let* ((jpeg-to-upload (plz 'get (url "/image/jpeg")
                            :as 'binary :then 'sync))
          (_ (unless jpeg-to-upload
               (error "jpeg-to-upload is nil")))
          (response-json)
          (response-jpeg)
-         (process (plz 'post (plz-test-url "/post")
+         (process (plz 'post (url "/post")
                     :headers '(("Content-Type" . "image/jpeg"))
                     :body jpeg-to-upload :body-type 'binary
                     :as #'json-read
@@ -252,7 +200,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 (plz-deftest plz-put-json-string nil
   (let* ((json-string (json-encode (list (cons "key" "value"))))
          (response-json)
-         (process (plz 'put (plz-test-url "/put")
+         (process (plz 'put (url "/put")
                     :headers '(("Content-Type" . "application/json"))
                     :body json-string
                     :as #'json-read
@@ -268,21 +216,21 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 ;;;;; Sync
 
 (plz-deftest plz-get-string-sync nil
-  (let-alist (json-read-from-string (plz 'get (plz-test-url "/get")
+  (let-alist (json-read-from-string (plz 'get (url "/get")
                                       :as 'string :then 'sync))
-    (should (equal (plz-test-url "/get") .url))))
+    (should (equal (url "/get") .url))))
 
 (plz-deftest plz-get-response-sync nil
-  (plz-test-get-response (plz 'get (plz-test-url "/get")
+  (plz-test-get-response (plz 'get (url "/get")
                            :as 'response :then 'sync)))
 
 (plz-deftest plz-get-json-sync nil
-  (let-alist (plz 'get (plz-test-url "/get")
+  (let-alist (plz 'get (url "/get")
                :as #'json-read :then 'sync)
     (should (string-match "curl" .headers.User-Agent))))
 
 (plz-deftest plz-get-buffer-sync nil
-  (let ((buffer (plz 'get (plz-test-url "/get")
+  (let ((buffer (plz 'get (url "/get")
                   :as 'buffer :then 'sync)))
     (unwind-protect
         (should (buffer-live-p buffer))
@@ -295,7 +243,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-with-headers ()
   (let* ((response-json)
-         (process (plz 'get (plz-test-url "/get")
+         (process (plz 'get (url "/get")
                     :headers '(("X-Plz-Test-Header" . "plz-test-header-value"))
                     :as #'json-read
                     :then (lambda (json)
@@ -307,7 +255,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 (plz-deftest plz-post-with-headers ()
   (let* ((alist (list (cons "key" "value")))
          (response-json)
-         (process (plz 'post (plz-test-url "/post")
+         (process (plz 'post (url "/post")
                     :headers '(("Content-Type" . "application/json")
                                ("X-Plz-Test-Header" . "plz-test-header-value"))
                     :body (json-encode alist)
@@ -320,7 +268,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
       (should (equal "value" (alist-get 'key (json-read-from-string 
.data)))))))
 
 (plz-deftest plz-get-json-with-headers-sync ()
-  (let-alist (plz 'get (plz-test-url "/get")
+  (let-alist (plz 'get (url "/get")
                :headers '(("X-Plz-Test-Header" . "plz-test-header-value"))
                :as #'json-read :then 'sync)
     (should (string-match "curl" .headers.User-Agent))
@@ -337,10 +285,10 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
   ;; lightweight way to test a server's presence, so we should
   ;; probably support it.  This merely tests that no error is
   ;; signaled, which should mean that the HEAD request succeeded.
-  (should (plz 'head (plz-test-url "/get"))))
+  (should (plz 'head (url "/get"))))
 
 (plz-deftest plz-head-as-response ()
-  (let ((response (plz 'head (plz-test-url "/get")
+  (let ((response (plz 'head (url "/get")
                     :as 'response)))
     (should (equal "application/json"
                    (alist-get 'content-type
@@ -352,44 +300,44 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
   (should (equal ""
                  (alist-get 'data
                             (json-read-from-string
-                             (plz 'post (plz-test-url "/post"))))))
+                             (plz 'post (url "/post"))))))
   (should (equal "application/json"
                  (alist-get 'content-type
                             (plz-response-headers
-                             (plz 'post (plz-test-url "/post") :as 
'response))))))
+                             (plz 'post (url "/post") :as 'response))))))
 
 ;;;;; Status codes
 
 (plz-deftest plz-201-succeeds ()
   ;; This merely tests that a 201 response does not signal an error.
-  (should (plz 'get (plz-test-url "/status/201"))))
+  (should (plz 'get (url "/status/201"))))
 
 (plz-deftest plz-400-errors ()
-  (should-error (plz 'get (plz-test-url "/status/400"))))
+  (should-error (plz 'get (url "/status/400"))))
 
 (plz-deftest plz-500-errors ()
-  (should-error (plz 'get (plz-test-url "/status/500"))))
+  (should-error (plz 'get (url "/status/500"))))
 
 ;;;;; Redirects
 
 (plz-deftest plz-301-redirects ()
   (plz-test-get-response
-   (plz 'get (plz-test-url "/redirect-to?url=URI-PREFIX%2Fget&status_code=301")
+   (plz 'get (url "/redirect-to?url=URI-PREFIX%2Fget&status_code=301")
      :as 'response :then 'sync)))
 
 (plz-deftest plz-302-redirects ()
   (plz-test-get-response
-   (plz 'get (plz-test-url "/redirect-to?url=URI-PREFIX%2Fget&status_code=302")
+   (plz 'get (url "/redirect-to?url=URI-PREFIX%2Fget&status_code=302")
      :as 'response :then 'sync)))
 
 (plz-deftest plz-307-redirects ()
   (plz-test-get-response
-   (plz 'get (plz-test-url "/redirect-to?url=URI-PREFIX%2Fget&status_code=307")
+   (plz 'get (url "/redirect-to?url=URI-PREFIX%2Fget&status_code=307")
      :as 'response :then 'sync)))
 
 (plz-deftest plz-308-redirects ()
   (plz-test-get-response
-   (plz 'get (plz-test-url "/redirect-to?url=URI-PREFIX%2Fget&status_code=308")
+   (plz 'get (url "/redirect-to?url=URI-PREFIX%2Fget&status_code=308")
      :as 'response :then 'sync)))
 
 ;;;;; Errors
@@ -438,7 +386,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-404-error-sync  nil
   (pcase-let ((`(,_signal . (,_message ,data))
-              (should-error (plz 'get (plz-test-url "/get/status/404")
+              (should-error (plz 'get (url "/get/status/404")
                               :as 'string :then 'sync)
                              :type 'plz-error)))
     (should (plz-error-p data))
@@ -447,7 +395,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-404-error-async nil
   (let* ((err)
-         (process (plz 'get (plz-test-url "/get/status/404")
+         (process (plz 'get (url "/get/status/404")
                     :as 'string :then #'ignore
                     :else (lambda (e)
                             (setf err e)))))
@@ -459,7 +407,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 (plz-deftest plz-get-timeout-error-sync nil
   (pcase-let* ((start-time (current-time))
                (`(,_signal . (,_message ,(cl-struct plz-error (curl-error 
`(,code . ,message)))))
-               (should-error (plz 'get (plz-test-url "/delay/5")
+               (should-error (plz 'get (url "/delay/5")
                                :as 'string :then 'sync :timeout 1)
                              :type 'plz-error))
                (end-time (current-time)))
@@ -471,7 +419,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
   (let* ((start-time (current-time))
          (end-time)
          (plz-error)
-         (process (plz 'get (plz-test-url "/delay/5")
+         (process (plz 'get (url "/delay/5")
                     :as 'response :timeout 1 :then #'ignore
                     :else (lambda (e)
                             (setf end-time (current-time)
@@ -485,7 +433,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-finally nil
   (let* ((finally-null t)
-         (process (plz 'get (plz-test-url "/get")
+         (process (plz 'get (url "/get")
                     :as 'string
                     :then #'ignore
                     :finally (lambda ()
@@ -497,7 +445,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
 
 (plz-deftest plz-get-jpeg ()
   (let* ((test-jpeg)
-         (process (plz 'get (plz-test-url "/image/jpeg")
+         (process (plz 'get (url "/image/jpeg")
                     :as 'binary
                     :then (lambda (string)
                             (setf test-jpeg string)))))
@@ -505,14 +453,14 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
     (should (equal 'jpeg (image-type-from-data test-jpeg)))))
 
 (plz-deftest plz-get-jpeg-sync ()
-  (let ((jpeg (plz 'get (plz-test-url "/image/jpeg")
+  (let ((jpeg (plz 'get (url "/image/jpeg")
                 :as 'binary :then 'sync)))
     (should (equal 'jpeg (image-type-from-data jpeg)))))
 
 ;;;;; Downloading to files
 
 (plz-deftest plz-get-temp-file ()
-  (let ((filename (plz 'get (plz-test-url "/image/jpeg")
+  (let ((filename (plz 'get (url "/image/jpeg")
                     :as 'file :then 'sync)))
     (unwind-protect
         (let ((jpeg-data (with-temp-buffer
@@ -529,7 +477,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
     (delete-file filename)
     (unwind-protect
         (progn
-          (plz 'get (plz-test-url "/image/jpeg")
+          (plz 'get (url "/image/jpeg")
             :as `(file ,filename) :then 'sync)
           (let ((jpeg-data (with-temp-buffer
                              (insert-file-contents filename)
@@ -547,7 +495,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is 
replaced with
           (with-temp-file filename
             (insert "deadbeef"))
           (setf process
-                (plz 'put (plz-test-url "/put")
+                (plz 'put (url "/put")
                   :body `(file ,filename)
                   :as #'json-read
                   :then (lambda (json)
@@ -571,7 +519,7 @@ and only called once."
                                 :finally (lambda ()
                                            (setf finally-called-at 
(current-time))
                                            (cl-incf finally-called-times))))
-         (urls (list (plz-test-url "/delay/2")))
+         (urls (list (url "/delay/2")))
          completed-urls queue-started-at)
     (dolist (url urls)
       (plz-queue queue
@@ -593,8 +541,8 @@ and only called once."
 (plz-deftest plz-queue-without-finally ()
   "Ensure that a queue without a FINALLY function doesn't signal an error."
   (let* ((queue (make-plz-queue :limit 2))
-         (urls (list (plz-test-url "/get?foo=0")
-                     (plz-test-url "/get?foo=1")))
+         (urls (list (url "/get?foo=0")
+                     (url "/get?foo=1")))
          completed-urls)
     (dolist (url urls)
       (plz-queue queue
@@ -611,6 +559,50 @@ and only called once."
 
 ;; TODO: Add test for canceling queue.
 
+;; Process filter
+
+(defun test-plz-process-filter (process output)
+  "Write OUTPUT to the PROCESS buffer."
+  (when (buffer-live-p (process-buffer process))
+    (with-current-buffer (process-buffer process)
+      (let ((movingp (= (point) (process-mark process))))
+        (save-excursion
+          (goto-char (process-mark process))
+          (insert output)
+          (set-marker (process-mark process) (point)))
+        (when movingp
+          (goto-char (process-mark process)))))))
+
+(plz-deftest plz-get-json-process-filter-async ()
+  (let* ((test-json) (outputs)
+         (process (plz 'get (url "/get")
+                    :as #'json-read
+                    :then (lambda (json)
+                            (setf test-json json))
+                    :filter (lambda (process output)
+                              (test-plz-process-filter process output)
+                              (push output outputs)))))
+    (plz-test-wait process)
+    (let-alist test-json
+      (should (string-match-p "curl" .headers.User-Agent)))
+    (let ((output (string-join (reverse outputs))))
+      (should (string-match-p "HTTP.*\s+200" output))
+      (should (string-match-p "Server: gunicorn" output))
+      (should (string-match-p "\"args\":\s*{}" output)))))
+
+(plz-deftest plz-get-json-process-filter-sync ()
+  (let* ((outputs)
+         (response (plz 'get (url "/get")
+                     :as 'response
+                     :filter (lambda (process output)
+                               (test-plz-process-filter process output)
+                               (push output outputs)))))
+    (plz-test-get-response response)
+    (let ((output (string-join (reverse outputs))))
+      (should (string-match-p "HTTP.*\s+200" output))
+      (should (string-match-p "Server: gunicorn" output))
+      (should (string-match-p "\"args\":\s*{}" output)))))
+
 ;;;; Footer
 
 (provide 'test-plz)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]