emacs-orgmode
[Top][All Lists]
Advanced

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

[Orgmode] Re: [Babel] Handling of errors when using Ledger


From: Dan Davison
Subject: [Orgmode] Re: [Babel] Handling of errors when using Ledger
Date: Thu, 23 Dec 2010 10:28:51 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (darwin)

Eric S Fraga <address@hidden> writes:

> Dan Davison <address@hidden> writes:
>
>> Eric S Fraga <address@hidden> writes:
>>
>>> Dan <address@hidden> writes:
>>>
>>> [...]
>>>
>>>> This patch should make ob-ledger use the common org-babel error mechanism. 
>>>> It is
>>>> in branch ledger of the main repo. However, I'm not yet a ledger user. 
>>>> Could
>>>> someone test it?
>>>
>>> Unfortunately, it doesn't work at all [1] for a very simple reason: you
>>> have removed the -f option which specifies the file that ledger should
>>> read.
>>
>> Hi Eric,
>>
>> Yes, ob-eval passes the src block body to the interpreter on standard
>> input. I assumed that ledger would be able to read its transaction data
>> from standard input. Is that not the case?  What about with "--file -"
>> or "-f -"?
>
>> [...]
>
>> If ledger can't read the src blocks body from stdin (and if it can't, I
>> expect there's a good reason why not), then maybe this is a motivation
>> for changing ob-eval so that the block body is read from file.
>
> Indeed, ledger cannot read from standard input.

Hi Eric,

I've asked on the ledger list and the 3.0 (and perhaps some older)
versions of ledger do support -f - to read from stdin. Could you try
this version of the patch?

Thanks,

Dan

diff --git a/lisp/ob-ledger.el b/lisp/ob-ledger.el
index a02eb6f..ef0f52e 100644
--- a/lisp/ob-ledger.el
+++ b/lisp/ob-ledger.el
@@ -43,24 +43,15 @@
   '((:results . "output") (:cmdline . "bal"))
   "Default arguments to use when evaluating a ledger source block.")
 
+(defvar org-babel-ledger-command "ledger"
+  "Command to invoke ledger")
+
 (defun org-babel-execute:ledger (body params)
   "Execute a block of Ledger entries with org-babel.  This function is
 called by `org-babel-execute-src-block'."
-  (message "executing Ledger source code block")
-  (let ((result-params (split-string (or (cdr (assoc :results params)) "")))
-       (cmdline (cdr (assoc :cmdline params)))
-        (in-file (org-babel-temp-file "ledger-"))
-       (out-file (org-babel-temp-file "ledger-output-")))
-    (with-temp-file in-file (insert body))
-    (message (concat "ledger"
-                    " -f " (org-babel-process-file-name in-file)
-                    " " cmdline))
-    (with-output-to-string
-      (shell-command (concat "ledger"
-                            " -f " (org-babel-process-file-name in-file)
-                            " " cmdline
-                            " > " (org-babel-process-file-name out-file))))
-    (with-temp-buffer (insert-file-contents out-file) (buffer-string))))
+  (org-babel-eval
+   (concat org-babel-ledger-command " -f - " (cdr (assoc :cmdline params)))
+   body))



>  From the man page:
>
> ,----
> |  All commands require a Ledger data file which can be specified with -f
> |  filename or via the LEDGER_FILE environment variable.
> `----
>
> and later:
>
> ,----
> |  -f, --file FILE
> | 
> |     Reads FILE as a Ledger file. This option may be specified multiple
> |     times.  FILE may also be a list of file names separated by colons.
> |     Typically, the environment variable LEDGER_FILE is set rather than
> |     using this command-line option.
> `----
>
> Using an environment variable is not a good or viable solution for
> babel, as far as I can figure, and there does not seem to be any concept
> of "-" for standard input in lieu of a file.  I cannot see any reason
> for this and, to be honest, I find it annoying [1] as a long time Unix user
> wishing to join tools together with pipes etc.  But maybe John Wiegley
> had his reasons for taking this decision.  Maybe he can comment on
> this... I think he reads this list?
>
>> Incidentally, I have for a long time wondered whether we should permit
>> src blocks to read *input data* from standard input. This would require
>> altering ob-eval such that the src block body is read from file. Then we
>> could do things like
>>
>> #+source: output-some-text
>> #+begin_src sh :results output
>>   # print stuff
>> #+end_src
>> #+begin_src perl :stdin output-some-text
>>   while ( <> ) {
>>       # process the text
>>   }
>> #+end_src
>
> This could be a solution.  In thinking about all of my babel uses, this
> would have no impact on me but others may have different opinions?  It
> would seem to be a safer route in any case?
>
> Thanks,
> eric
>
>
> Footnotes: 
> [1]   but not annoying enough to stop using ledger, of course, as it's a
>       brilliant tool otherwise!




reply via email to

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