From mboxrd@z Thu Jan 1 00:00:00 1970 From: stardiviner Subject: Re: [PATCH] add "link" :results type for Babel Date: Thu, 12 Apr 2018 10:04:05 +0800 Message-ID: <66a464bc-27a8-180c-d071-030cbe7cfcda@gmail.com> References: <87vacztlvw.fsf@gmail.com> <87fu41zcn2.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------5712E8AD4C65A0E5FDD45604" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:56665) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f6Ray-0003O6-FN for emacs-orgmode@gnu.org; Wed, 11 Apr 2018 22:04:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f6Rau-0000dr-E9 for emacs-orgmode@gnu.org; Wed, 11 Apr 2018 22:04:16 -0400 Received: from mail-pf0-x229.google.com ([2607:f8b0:400e:c00::229]:37862) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1f6Rau-0000cv-1x for emacs-orgmode@gnu.org; Wed, 11 Apr 2018 22:04:12 -0400 Received: by mail-pf0-x229.google.com with SMTP id p6so2277058pfn.4 for ; Wed, 11 Apr 2018 19:04:11 -0700 (PDT) In-Reply-To: <87fu41zcn2.fsf@nicolasgoaziou.fr> Content-Language: en-US List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Nicolas Goaziou Cc: org-mode This is a multi-part message in MIME format. --------------5712E8AD4C65A0E5FDD45604 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 04/12/2018 04:55 AM, Nicolas Goaziou wrote: > Hello, > > stardiviner writes: > >> This patch try to support following way: >> >> #+begin_src sh :results link :file "/tmp/test.txt" >> echo "hello" > /tmp/test.txt >> echo "test" >> #+end_src >> >> #+RESULTS: >> [[file:/tmp/test.txt]] >> >> Because: >> >> - ~org-babel-execute-src-block~ >> - ~(org-babel-get-src-block-info)~ >> - (let* ((info .. (apply #'org-babel-merge-params ...)))) >> - ~org-babel-merge-params~ >> - [ ] *because* code ~(`(,(or :file :file-ext) . ,value) ...)~ >> lines logic in function ~org-babel-get-src-block-info~, it >> merge "file" ~:results~, so override params plist :results >> value ~link~. >> - [ ] So I put ~link~ and ~graphics~ "~:results~" type into a >> separate group in constant >> ~org-babel-common-header-args-w-values~. >> >> If anybody has better way, please improve my code. > IIRC, there is no technical difference between ":results graphics" and > ":results link". So, what about simply stating that `link' and > `graphics' are equivalent, like, e.g., `table' and `vector' or `scalar' > and `verbatim'? > > Note that `graphics' results are not properly documented in the current > manual. They should probably go in "Working with Source Code/Results of > Evaluation/Format" section. updated. > >> - (results . ((file list vector table scalar verbatim) >> + (results . ( >> + ;; separate group to avoid been override by "file" >> + ;; :results in `org-babel-merge-params'. >> + (link) > `link' is not an output type. `graphics' is not defined here either. Updated. I put "link" and "graphics" into result format group now. This is really good. I have not come up with this. > >> +(ert-deftest test-ob/result-file-link-type-header-argument () >> + "Ensure that the result is a link to a file. >> +The file is just a link to :file value. Inhibit non-empty result write to :file." >> + (org-test-with-temp-text "#+begin_src shell :results value link :file \"/tmp/test.txt\" >> +echo \"hello\" > /tmp/test.txt >> +echo \"test\" >> +#+end_src" >> + (org-babel-execute-src-block) >> + (goto-char (point-min)) >> + (should (search-forward "[[file:/tmp/test.txt]]" nil nil)) >> + (should (with-temp-buffer >> + (insert-file-contents "/tmp/test.txt") >> + (string= >> + "hello\n" >> + (buffer-substring-no-properties (point-min) (point-max))))))) > Note that this test already passes when "link" is substituted with "graphics". > > Regards, > I think keep "graphics" result format test is necessary. Even though is is almost same way "link" result format test. Because I have some ideas on graphics result format. Might add in the future. Also it provide straight mean for result format. People can understand it clearly. What do you think? I attached new generated patches. --------------5712E8AD4C65A0E5FDD45604 Content-Type: text/x-patch; name="0001-ob-core.el-add-link-results-format-for-babel.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="0001-ob-core.el-add-link-results-format-for-babel.patch" >From 148d084ef100fb4ca32f8f19e36d4dcbe643b6b4 Mon Sep 17 00:00:00 2001 From: stardiviner Date: Sun, 8 Apr 2018 20:56:28 +0800 Subject: [PATCH 1/2] ob-core.el: add "link" :results format for babel. * lisp/ob-core.el (org-babel-execute-src-block): handle "link" :results format. Don't write result to :file specified file. * etc/ORG-NEWS: declare new "link" :results format. * doc/org-manual.org: add document for new result format "link". * testing/lisp/test-ob.el (test-ob/result-file-link-type-header-argument): Add test for new added :results format "link". --- doc/org-manual.org | 12 ++++++++++++ etc/ORG-NEWS | 9 +++++++++ lisp/ob-core.el | 12 ++++++------ testing/lisp/test-ob.el | 16 ++++++++++++++++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index d787e5da4..afd968a38 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -17224,6 +17224,18 @@ follows from the type specified above. =raw= or =org= results for later scripting and automated processing. Usage example: =:results value drawer=. +- =link= :: + + #+cindex: @samp{link}, header argument + When this result type used with header argument =:file=. Generate a + link to =:file= specified file. Instead of writing src block + evaluate non-empty result to =:file= specified file. Like following + example: + + #+begin_src shell :results link :file "download.tar.gz" + wget -c "http://example.com/download.tar.gz" + #+end_src + *** Handling :PROPERTIES: :UNNUMBERED: notoc diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 0edd77115..3833b57b2 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -113,6 +113,15 @@ now sort according to the locale’s collation rules instead of by code-point. ** New features +*** Add ~:results link~ support for org-babel +This will support only insert file link without writing result to file. +Like this case: +#+begin_src shell :dir "data/tmp" :results link :file "crackzor_1.0.c.gz" +wget -c "http://ben.akrin.com/crackzor/crackzor_1.0.c.gz" +#+end_src + +#+RESULTS: +[[file:data/tmp/crackzor_1.0.c.gz]] *** Add ~:session~ support of ob-js for js-comint #+begin_src js :session "*Javascript REPL*" console.log("stardiviner") diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 129e17f62..2b72d7b32 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -414,7 +414,7 @@ then run `org-babel-switch-to-session'." (post . :any) (prologue . :any) (results . ((file list vector table scalar verbatim) - (raw html latex org code pp drawer) + (raw html latex org code pp drawer link) (replace silent none append prepend) (output value))) (rownames . ((no yes))) @@ -706,11 +706,11 @@ block." (let ((file (cdr (assq :file params)))) ;; If non-empty result and :file then write to :file. (when file - (let ((graphics? - (member "graphics" (cdr (assq :result-params params))))) - ;; Handle :results graphics :file case. Don't - ;; write result to file if result is graphics. - (when (and result (not graphics?)) + (let ((graphics? (member "graphics" (cdr (assq :result-params params)))) + (file-link? (member "link" (cdr (assq :result-params params))))) + ;; If :results are special types like `link', `graphics' etc. + ;; don't write result to `:file'. Literately only insert link to :file. + (when (and result (not graphics?) (not file-link?)) (with-temp-file file (insert (org-babel-format-result result (cdr (assq :sep params))))))) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index a4a590d6a..e541ad726 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -996,6 +996,22 @@ trying to find the :END: marker." (should (search-forward "[[file:foo][bar]]" nil t)) (should (search-forward "[[file:foo][foo]]" nil t)))) +(ert-deftest test-ob/result-file-link-type-header-argument () + "Ensure that the result is a link to a file. +The file is just a link to :file value. Inhibit non-empty result write to :file." + (org-test-with-temp-text "#+begin_src shell :results value link :file \"/tmp/test.txt\" +echo \"hello\" > /tmp/test.txt +echo \"test\" +#+end_src" + (org-babel-execute-src-block) + (goto-char (point-min)) + (should (search-forward "[[file:/tmp/test.txt]]" nil nil)) + (should (with-temp-buffer + (insert-file-contents "/tmp/test.txt") + (string= + "hello\n" + (buffer-substring-no-properties (point-min) (point-max))))))) + (ert-deftest test-ob/inline-src_blk-preceded-punct-preceded-by-point () (let ((test-line ".src_emacs-lisp[ :results verbatim ]{ \"x\" }") (org-babel-inline-result-wrap "=%s=")) -- 2.17.0 --------------5712E8AD4C65A0E5FDD45604 Content-Type: text/x-patch; name="0002-ob-core.el-add-document-and-test-for-graphics-result.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0002-ob-core.el-add-document-and-test-for-graphics-result.pa"; filename*1="tch" >From d62e605ea127c18795e918b077da9155af31cacd Mon Sep 17 00:00:00 2001 From: stardiviner Date: Thu, 12 Apr 2018 09:54:23 +0800 Subject: [PATCH 2/2] ob-core.el: add document and test for "graphics" :results format. * doc/org-manual.org: add document. * lisp/ob-core.el (org-babel-common-header-args-w-values): add symbol "graphics". * testing/lisp/test-ob.el (test-ob/result-graphics-link-type-header-argument): add test for graphics result format. --- doc/org-manual.org | 14 ++++++++++++++ lisp/ob-core.el | 2 +- testing/lisp/test-ob.el | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index afd968a38..a2ad8df43 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -17236,6 +17236,20 @@ follows from the type specified above. wget -c "http://example.com/download.tar.gz" #+end_src +- =graphics= :: + + #+cindex: @samp{graphics}, header argument + It is technically same with =link= result type. This will be useful + for generating Org inline image for src blocks. Like following + example: + + #+begin_src R :results graphics :file "graphics-result.png" + plot(seq(1,10)) + #+end_src + + #+RESULTS: + [[file:graphics-result.png]] + *** Handling :PROPERTIES: :UNNUMBERED: notoc diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 2b72d7b32..1580795db 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -414,7 +414,7 @@ then run `org-babel-switch-to-session'." (post . :any) (prologue . :any) (results . ((file list vector table scalar verbatim) - (raw html latex org code pp drawer link) + (raw html latex org code pp drawer link graphics) (replace silent none append prepend) (output value))) (rownames . ((no yes))) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index e541ad726..3b7958552 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -1012,6 +1012,22 @@ echo \"test\" "hello\n" (buffer-substring-no-properties (point-min) (point-max))))))) +(ert-deftest test-ob/result-graphics-link-type-header-argument () + "Ensure that the result is a link to an image. +The file is just a link to :file value. Inhibit non-empty result write to :file." +(org-test-with-temp-text "#+begin_src shell :results value graphics :file \"/tmp/test.txt\" +echo \"hello\" > /tmp/test.txt +echo \"test\" +#+end_src" + (org-babel-execute-src-block) + (goto-char (point-min)) + (should (search-forward "[[file:/tmp/test.txt]]" nil nil)) + (should (with-temp-buffer + (insert-file-contents "/tmp/test.txt") + (string= + "hello\n" + (buffer-substring-no-properties (point-min) (point-max))))))) + (ert-deftest test-ob/inline-src_blk-preceded-punct-preceded-by-point () (let ((test-line ".src_emacs-lisp[ :results verbatim ]{ \"x\" }") (org-babel-inline-result-wrap "=%s=")) -- 2.17.0 --------------5712E8AD4C65A0E5FDD45604--