Add 2011 to remaining FSF/AIST copyright years.
[bpt/emacs.git] / lisp / org / ob-ruby.el
index e557c80..76a2886 100644 (file)
@@ -1,11 +1,11 @@
 ;;; ob-ruby.el --- org-babel functions for ruby evaluation
 
-;; Copyright (C) 2009, 2010  Free Software Foundation
+;; Copyright (C) 2009, 2010, 2011  Free Software Foundation
 
 ;; Author: Eric Schulte
 ;; Keywords: literate programming, reproducible research
 ;; Homepage: http://orgmode.org
-;; Version: 7.01
+;; Version: 7.4
 
 ;; This file is part of GNU Emacs.
 
 (defvar org-babel-ruby-command "ruby"
   "Name of command to use for executing ruby code.")
 
-(defun org-babel-expand-body:ruby (body params &optional processed-params)
-  "Expand BODY according to PARAMS, return the expanded body."
-  (require 'inf-ruby)
-  (let ((vars (nth 1 (or processed-params (org-babel-process-params params)))))
-    (concat
-     (mapconcat ;; define any variables
-      (lambda (pair)
-        (format "%s=%s"
-                (car pair)
-                (org-babel-ruby-var-to-ruby (cdr pair))))
-      vars "\n") "\n" body "\n")))
-
 (defun org-babel-execute:ruby (body params)
   "Execute a block of Ruby code with Babel.
 This function is called by `org-babel-execute-src-block'."
-  (let* ((processed-params (org-babel-process-params params))
-         (session (org-babel-ruby-initiate-session (first processed-params)))
-         (result-params (nth 2 processed-params))
-         (result-type (nth 3 processed-params))
-         (full-body (org-babel-expand-body:ruby
-                     body params processed-params))
+  (let* ((session (org-babel-ruby-initiate-session
+                  (cdr (assoc :session params))))
+         (result-params (cdr (assoc :result-params params)))
+         (result-type (cdr (assoc :result-type params)))
+         (full-body (org-babel-expand-body:generic
+                    body params (org-babel-variable-assignments:ruby params)))
          (result (org-babel-ruby-evaluate
                  session full-body result-type result-params)))
     (or (cdr (assoc :file params))
         (org-babel-reassemble-table
          result
-         (org-babel-pick-name (nth 4 processed-params)
+         (org-babel-pick-name (cdr (assoc :colname-names params))
                              (cdr (assoc :colnames params)))
-         (org-babel-pick-name (nth 5 processed-params)
+         (org-babel-pick-name (cdr (assoc :rowname-names params))
                              (cdr (assoc :rownames params)))))))
 
 (defun org-babel-prep-session:ruby (session params)
   "Prepare SESSION according to the header arguments specified in PARAMS."
   ;; (message "params=%S" params) ;; debugging
   (let* ((session (org-babel-ruby-initiate-session session))
-         (vars (org-babel-ref-variables params))
-         (var-lines (mapcar ;; define any variables
-                     (lambda (pair)
-                       (format "%s=%s"
-                               (car pair)
-                               (org-babel-ruby-var-to-ruby (cdr pair))))
-                     vars)))
+         (var-lines (org-babel-variable-assignments:ruby params)))
     (org-babel-comint-in-buffer session
       (sit-for .5) (goto-char (point-max))
       (mapc (lambda (var)
@@ -113,6 +95,15 @@ This function is called by `org-babel-execute-src-block'."
 
 ;; helper functions
 
+(defun org-babel-variable-assignments:ruby (params)
+  "Return list of ruby statements assigning the block's variables"
+  (mapcar
+   (lambda (pair)
+     (format "%s=%s"
+            (car pair)
+            (org-babel-ruby-var-to-ruby (cdr pair))))
+   (mapcar #'cdr (org-babel-get-header params :var))))
+
 (defun org-babel-ruby-var-to-ruby (var)
   "Convert VAR into a ruby variable.
 Convert an elisp value into a string of ruby source code
@@ -125,16 +116,7 @@ specifying a variable of the same value."
   "Convert RESULTS into an appropriate elisp value.
 If RESULTS look like a table, then convert them into an
 Emacs-lisp table, otherwise return the results as a string."
-  (org-babel-read
-   (if (and (stringp results) (string-match "^\\[.+\\]$" results))
-       (org-babel-read
-        (concat "'"
-                (replace-regexp-in-string
-                 "\\[" "(" (replace-regexp-in-string
-                            "\\]" ")" (replace-regexp-in-string
-                                       ", " " " (replace-regexp-in-string
-                                                "'" "\"" results))))))
-     results)))
+  (org-babel-script-escape results))
 
 (defun org-babel-ruby-initiate-session (&optional session params)
   "Initiate a ruby session.
@@ -186,12 +168,13 @@ return the value of the last statement in BODY, as elisp."
       ;; external process evaluation
       (case result-type
        (output (org-babel-eval org-babel-ruby-command body))
-       (value (let ((tmp-file (make-temp-file "org-babel-ruby-results-")))
-                (org-babel-eval org-babel-ruby-command
-                                (format (if (member "pp" result-params)
-                                            org-babel-ruby-pp-wrapper-method
-                                          org-babel-ruby-wrapper-method)
-                                        body tmp-file))
+       (value (let ((tmp-file (org-babel-temp-file "ruby-")))
+                (org-babel-eval
+                 org-babel-ruby-command
+                 (format (if (member "pp" result-params)
+                             org-babel-ruby-pp-wrapper-method
+                           org-babel-ruby-wrapper-method)
+                         body (org-babel-process-file-name tmp-file 'noquote)))
                 ((lambda (raw)
                    (if (or (member "code" result-params)
                            (member "pp" result-params))
@@ -221,7 +204,7 @@ return the value of the last statement in BODY, as elisp."
          (if (or (member "code" result-params) (member "pp" result-params))
              results
            (org-babel-ruby-table-or-string results)))
-       (let* ((tmp-file (make-temp-file "org-babel-ruby-results-"))
+       (let* ((tmp-file (org-babel-temp-file "ruby-"))
               (ppp (or (member "code" result-params)
                        (member "pp" result-params))))
          (org-babel-comint-with-output
@@ -233,10 +216,12 @@ return the value of the last statement in BODY, as elisp."
             (append
              (list body)
              (if (not ppp)
-                 (list (format org-babel-ruby-f-write tmp-file))
+                 (list (format org-babel-ruby-f-write
+                               (org-babel-process-file-name tmp-file 'noquote)))
                (list
                 "results=_" "require 'pp'" "orig_out = $stdout"
-                (format org-babel-ruby-pp-f-write tmp-file)))
+                (format org-babel-ruby-pp-f-write
+                        (org-babel-process-file-name tmp-file 'noquote))))
              (list org-babel-ruby-eoe-indicator)))
            (comint-send-input nil t))
          (org-babel-eval-read-file tmp-file)))))))