[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] ob-python newline & indentation behavior
From: |
John Kamm |
Subject: |
Re: [O] ob-python newline & indentation behavior |
Date: |
Sat, 09 Dec 2017 12:12:07 +0000 |
User-agent: |
mu4e 0.9.18; emacs 25.3.1 |
Kyle Meyer writes:
> Hmm, according to the site below, a response should come within 5
> business days. That fits with my personal experience, but I'm not sure
> what's typical. Also, the delay might be Thanksgiving-related.
FSF sent me the papers which I signed and returned about a week ago, am
just waiting for the final confirmation now.
>> Given how broken ":session :results value" is, and the difficulty in
>> implementing it correctly, I agree with Kyle's suggestion to remove it.
>> Should we start another thread to discuss this?
>
> I think that'd be good since 1) someone with an opinion on that topic
> might not notice it within this thread and 2) it's now orthogonal to
> this patch.
Great, I'll start another thread in a few days, summarizing the various
options you laid out before. Another idea I had was to have some special
"result" variable that could be assigned to. Anyways, we can discuss
more in the new thread.
> ... (suggestions to improve patch)
I've incorporated all your suggestions/improvements into the patch,
please see below. Thanks again for spending time to review it.
>From 40e961e349fdb347fbf9d59b3aca58163749f804 Mon Sep 17 00:00:00 2001
From: Jack Kamm <address@hidden>
Date: Sat, 2 Dec 2017 09:03:00 +0000
Subject: [PATCH] ob-python: Fix :session :results output multiline behavior
* lisp/ob-python.el (orb-babel-python-evaluate-session): When :session
:results output, send multiline code blocks to tmpfile and execute in
Python with exec().
(org-babel-python--exec-tmpfile): New function.
* testing/lisp/test-ob-python.el (test-ob-python/session-multiline):
Test for :session with multiple lines and indentation.
---
lisp/ob-python.el | 36 ++++++++++++++++++++++++++----------
testing/lisp/test-ob-python.el | 17 +++++++++++++++++
2 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/lisp/ob-python.el b/lisp/ob-python.el
index 60ec5fa47..b3f50cfe5 100644
--- a/lisp/ob-python.el
+++ b/lisp/ob-python.el
@@ -239,6 +239,15 @@ def main():
open('%s', 'w').write( pprint.pformat(main()) )")
+(defconst org-babel-python--exec-tmpfile
+ (concat
+ "__org_babel_python_fname = '%s'; "
+ "__org_babel_python_fh = open(__org_babel_python_fname); "
+ "exec(compile("
+ "__org_babel_python_fh.read(), __org_babel_python_fname, 'exec'"
+ ")); "
+ "__org_babel_python_fh.close()"))
+
(defun org-babel-python-evaluate
(session body &optional result-type result-params preamble)
"Evaluate BODY as Python code."
@@ -306,16 +315,23 @@ last statement in BODY, as elisp."
(results
(pcase result-type
(`output
- (mapconcat
- #'org-trim
- (butlast
- (org-babel-comint-with-output
- (session org-babel-python-eoe-indicator t body)
- (funcall input-body body)
- (funcall send-wait) (funcall send-wait)
- (insert org-babel-python-eoe-indicator)
- (funcall send-wait))
- 2) "\n"))
+ (let ((body (if (string-match-p ".\n+." body) ; Multiline
+ (let ((tmp-src-file (org-babel-temp-file
+ "python-")))
+ (with-temp-file tmp-src-file (insert body))
+ (format org-babel-python--exec-tmpfile
+ tmp-src-file))
+ body)))
+ (mapconcat
+ #'org-trim
+ (butlast
+ (org-babel-comint-with-output
+ (session org-babel-python-eoe-indicator t body)
+ (funcall input-body body)
+ (funcall send-wait) (funcall send-wait)
+ (insert org-babel-python-eoe-indicator)
+ (funcall send-wait))
+ 2) "\n")))
(`value
(let ((tmp-file (org-babel-temp-file "python-")))
(org-babel-comint-with-output
diff --git a/testing/lisp/test-ob-python.el b/testing/lisp/test-ob-python.el
index d9fca220f..915b1bc77 100644
--- a/testing/lisp/test-ob-python.el
+++ b/testing/lisp/test-ob-python.el
@@ -101,6 +101,23 @@ return x
(should (equal '(("col") ("a") ("b"))
(org-babel-execute-src-block)))))
+(ert-deftest test-ob-python/session-multiline ()
+ ;; FIXME workaround to prevent starting prompt leaking into output
+ (run-python)
+ (sleep-for 0 10)
+ (org-test-with-temp-text "
+#+begin_src python :session :results output
+ foo = 0
+ for _ in range(10):
+ foo += 1
+
+ foo += 1
+
+ print(foo)
+#+end_src"
+ (org-babel-next-src-block)
+ (should (equal "20" (org-babel-execute-src-block)))))
+
(provide 'test-ob-python)
;;; test-ob-python.el ends here
--
2.15.1
- Re: [O] ob-python newline & indentation behavior,
John Kamm <=