]> code.delx.au - gnu-emacs/blobdiff - lisp/org/ob-ruby.el
Update copyright year to 2014 by running admin/update-copyright.
[gnu-emacs] / lisp / org / ob-ruby.el
index e557c80ef1a6eaa8c2985fddf46b92e0f9c21616..5b31247bdc303d1fe77be9554a7daa692707949c 100644 (file)
@@ -1,11 +1,10 @@
 ;;; ob-ruby.el --- org-babel functions for ruby evaluation
 
-;; Copyright (C) 2009, 2010  Free Software Foundation
+;; Copyright (C) 2009-2014 Free Software Foundation, Inc.
 
 ;; Author: Eric Schulte
 ;; Keywords: literate programming, reproducible research
 ;; Homepage: http://orgmode.org
-;; Version: 7.01
 
 ;; This file is part of GNU Emacs.
 
 ;;; Requirements:
 
 ;; - ruby and irb executables :: http://www.ruby-lang.org/
-;; 
+;;
 ;; - ruby-mode :: Can be installed through ELPA, or from
 ;;   http://github.com/eschulte/rinari/raw/master/util/ruby-mode.el
-;;   
+;;
 ;; - inf-ruby mode :: Can be installed through ELPA, or from
 ;;   http://github.com/eschulte/rinari/raw/master/util/inf-ruby.el
 
 ;;; Code:
 (require 'ob)
-(require 'ob-ref)
-(require 'ob-comint)
-(require 'ob-eval)
 (eval-when-compile (require 'cl))
 
 (declare-function run-ruby "ext:inf-ruby" (&optional command name))
+(declare-function xmp "ext:rcodetools" (&optional option))
 
+(defvar org-babel-tangle-lang-exts)
 (add-to-list 'org-babel-tangle-lang-exts '("ruby" . "rb"))
 
 (defvar org-babel-default-header-args:ruby '())
 (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")))
+(defcustom org-babel-ruby-hline-to "nil"
+  "Replace hlines in incoming tables with this when translating to ruby."
+  :group 'org-babel
+  :version "24.4"
+  :package-version '(Org . "8.0")
+  :type 'string)
+
+(defcustom org-babel-ruby-nil-to 'hline
+  "Replace 'nil' in ruby tables with this before returning."
+  :group 'org-babel
+  :version "24.4"
+  :package-version '(Org . "8.0")
+  :type 'symbol)
 
 (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))
-         (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)
-                             (cdr (assoc :colnames params)))
-         (org-babel-pick-name (nth 5 processed-params)
-                             (cdr (assoc :rownames 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 (if (member "xmp" result-params)
+                    (with-temp-buffer
+                      (require 'rcodetools)
+                      (insert full-body)
+                      (xmp (cdr (assoc :xmp-option params)))
+                      (buffer-string))
+                  (org-babel-ruby-evaluate
+                   session full-body result-type result-params))))
+    (org-babel-reassemble-table
+     (org-babel-result-cond result-params
+       result
+       (org-babel-ruby-table-or-string result))
+     (org-babel-pick-name (cdr (assoc :colname-names params))
+                         (cdr (assoc :colnames 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,35 +114,42 @@ 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
 specifying a variable of the same value."
   (if (listp var)
       (concat "[" (mapconcat #'org-babel-ruby-var-to-ruby var ", ") "]")
-    (format "%S" var)))
+    (if (equal var 'hline)
+       org-babel-ruby-hline-to
+      (format "%S" var))))
 
 (defun org-babel-ruby-table-or-string (results)
   "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)))
+  (let ((res (org-babel-script-escape results)))
+    (if (listp res)
+        (mapcar (lambda (el) (if (equal el 'nil)
+                            org-babel-ruby-nil-to el))
+                res)
+      res)))
 
 (defun org-babel-ruby-initiate-session (&optional session params)
   "Initiate a ruby session.
 If there is not a current inferior-process-buffer in SESSION
 then create one.  Return the initialized session."
-  (require 'inf-ruby)
   (unless (string= session "none")
+    (require 'inf-ruby)
     (let ((session-buffer (save-window-excursion
                            (run-ruby nil session) (current-buffer))))
       (if (org-babel-comint-buffer-livep session-buffer)
@@ -186,18 +194,18 @@ 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))
-                ((lambda (raw)
-                   (if (or (member "code" result-params)
-                           (member "pp" result-params))
-                       raw
-                     (org-babel-ruby-table-or-string raw)))
-                 (org-babel-eval-read-file 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)))
+                (let ((raw (org-babel-eval-read-file tmp-file)))
+                   (if (or (member "code" result-params)
+                           (member "pp" result-params))
+                       raw
+                     (org-babel-ruby-table-or-string raw))))))
     ;; comint session evaluation
     (case result-type
       (output
@@ -217,29 +225,27 @@ return the value of the last statement in BODY, as elisp."
              (comint-send-input nil t)) 2)
           "\n") "[\r\n]")) "\n"))
       (value
-       ((lambda (results)
-         (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-"))
-              (ppp (or (member "code" result-params)
-                       (member "pp" result-params))))
-         (org-babel-comint-with-output
-             (buffer org-babel-ruby-eoe-indicator t body)
-           (when ppp (insert "require 'pp';") (comint-send-input nil t))
-           (mapc
-            (lambda (line)
-              (insert (org-babel-chomp line)) (comint-send-input nil t))
-            (append
-             (list body)
-             (if (not ppp)
-                 (list (format org-babel-ruby-f-write tmp-file))
-               (list
-                "results=_" "require 'pp'" "orig_out = $stdout"
-                (format org-babel-ruby-pp-f-write tmp-file)))
-             (list org-babel-ruby-eoe-indicator)))
-           (comint-send-input nil t))
-         (org-babel-eval-read-file tmp-file)))))))
+       (let* ((tmp-file (org-babel-temp-file "ruby-"))
+             (ppp (or (member "code" result-params)
+                      (member "pp" result-params))))
+        (org-babel-comint-with-output
+            (buffer org-babel-ruby-eoe-indicator t body)
+          (when ppp (insert "require 'pp';") (comint-send-input nil t))
+          (mapc
+           (lambda (line)
+             (insert (org-babel-chomp line)) (comint-send-input nil t))
+           (append
+            (list body)
+            (if (not ppp)
+                (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
+                       (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))))))
 
 (defun org-babel-ruby-read-string (string)
   "Strip \\\"s from around a ruby string."
@@ -249,6 +255,6 @@ return the value of the last statement in BODY, as elisp."
 
 (provide 'ob-ruby)
 
-;; arch-tag: 3e9726db-4520-49e2-b263-e8f571ac88f5
+
 
 ;;; ob-ruby.el ends here