]> gitweb.factorcode.org Git - factor.git/commitdiff
FUEL: Automatic insertion of scaffolding in docs and test upon file creation.
authorJose A. Ortega Ruiz <jao@gnu.org>
Tue, 2 Jun 2009 01:21:35 +0000 (03:21 +0200)
committerJose A. Ortega Ruiz <jao@gnu.org>
Tue, 2 Jun 2009 01:21:35 +0000 (03:21 +0200)
misc/fuel/factor-mode.el
misc/fuel/fuel-mode.el
misc/fuel/fuel-scaffold.el

index af0f62aa276f6907825f5078572a4a93a91d2772..cc8ebe35fb998af210d8013c10631d880909e56d 100644 (file)
@@ -36,13 +36,6 @@ When set to false, you'll be asked only once."
   :type 'boolean
   :group 'factor-mode)
 
-(defcustom factor-mode-cycle-insert-docs-p 'ask
-  "Whether to insert documentation templates upon creation of doc
-file during cycling."
-  :type '(choice (const :tag "Never" nil)
-                 (const :tag "Always" 'always)
-                 (const :tag "Ask me" 'ask)))
-
 (defcustom factor-mode-use-fuel t
   "Whether to use the full FUEL facilities in factor mode.
 
@@ -233,23 +226,18 @@ code in the buffer."
 (defsubst factor-mode--cycling-setup ()
   (setq factor-mode--cycling-no-ask nil))
 
-(defun factor-mode--other-file-doc-p (file)
-  (let ((bn (file-name-nondirectory file)))
-    (and (string-match "\\(.+\\)-docs.factor" bn)
+(defun factor-mode--code-file (kind &optional file)
+  (let* ((file (or file (buffer-file-name)))
+         (bn (file-name-nondirectory file)))
+    (and (string-match (format "\\(.+\\)-%s\\.factor$" kind) bn)
          (expand-file-name (concat (match-string 1 bn) ".factor")
                            (file-name-directory file)))))
 
-(defun factor-mode--other-file-check-docs (file)
-  (when (and factor-mode-cycle-insert-docs-p
-             (boundp 'fuel-mode)
-             fuel-mode)
-    (let ((code-file (factor-mode--other-file-doc-p file)))
-      (when (and code-file
-                 (or (eq factor-mode-cycle-insert-docs-p 'always)
-                     (y-or-n-p "Insert doc templates? ")))
-        (save-excursion
-          (set-buffer (find-file-noselect code-file))
-          (fuel-scaffold-help))))))
+(defsubst factor-mode--in-docs (&optional file)
+  (factor-mode--code-file "docs"))
+
+(defsubst factor-mode--in-tests (&optional file)
+  (factor-mode--code-file "tests"))
 
 (defun factor-mode-visit-other-file (&optional skip)
   "Cycle between code, tests and docs factor files.
@@ -257,8 +245,6 @@ With prefix, non-existing files will be skipped."
   (interactive "P")
   (let ((file (factor-mode--cycle-next (buffer-file-name) skip)))
     (unless file (error "No other file found"))
-    (unless (file-exists-p file)
-      (factor-mode--other-file-check-docs file))
     (find-file file)
     (unless (file-exists-p file)
       (set-buffer-modified-p t)
index 0186392f3445736e830dbb8764c1e9df549a52c7..282ef3240f15ae83f5cdcedaec1be22ad2e33dc4 100644 (file)
@@ -172,7 +172,10 @@ interacting with a factor listener is at your disposal.
   (when fuel-mode-autodoc-p (fuel-autodoc-mode fuel-mode))
 
   (setq fuel-stack-mode-string "/S")
-  (when fuel-mode-stack-p (fuel-stack-mode fuel-mode)))
+  (when fuel-mode-stack-p (fuel-stack-mode fuel-mode))
+
+  (when (and fuel-mode (not (file-exists-p (buffer-file-name))))
+    (fuel-scaffold--maybe-insert)))
 
 \f
 ;;; Keys:
index b1c446250397e074ac6d56ba3554b207989dfa1d..9b7d9861c715b4c2c33c418d752db4e726cac7d4 100644 (file)
   (let ((cmd '(:fuel* (vocab-roots get :get) "fuel")))
     (fuel-eval--retort-result (fuel-eval--send/wait cmd))))
 
+(defun fuel-scaffold--dev-name ()
+  (or fuel-scaffold-developer-name
+      (let ((cmd '(:fuel* (developer-name get :get) "fuel")))
+        (fuel-eval--retort-result (fuel-eval--send/wait cmd)))
+      "Your name"))
+
+(defun fuel-scaffold--first-vocab ()
+  (goto-char (point-min))
+  (re-search-forward fuel-syntax--current-vocab-regex nil t))
+
+(defsubst fuel-scaffold--vocab (file)
+  (save-excursion
+    (set-buffer (find-file-noselect file))
+    (fuel-scaffold--first-vocab)
+    (fuel-syntax--current-vocab)))
+
+(defconst fuel-scaffold--tests-header-format
+  "! Copyright (C) %s %s
+! See http://factorcode.org/license.txt for BSD license.
+USING: %s tools.test ;
+IN: %s
+")
+
+(defsubst fuel-scaffold--check-auto (var)
+  (and var (or (eq var 'always) (y-or-n-p "Insert template? "))))
+
+(defun fuel-scaffold--tests (parent)
+  (when (and parent (fuel-scaffold--check-auto fuel-scaffold-test-autoinsert-p))
+    (let ((year (format-time-string "%Y"))
+          (name (fuel-scaffold--dev-name))
+          (vocab (fuel-scaffold--vocab parent)))
+      (insert (format fuel-scaffold--tests-header-format
+                      year name vocab vocab))
+      t)))
+
+(defsubst fuel-scaffold--create-docs (vocab)
+  (let ((cmd `(:fuel* (,vocab ,fuel-scaffold-developer-name fuel-scaffold-help)
+                      "fuel")))
+    (fuel-eval--send/wait cmd)))
+
+(defun fuel-scaffold--help (parent)
+  (when (and parent (fuel-scaffold--check-auto fuel-scaffold-help-autoinsert-p))
+    (let* ((ret (fuel-scaffold--create-docs (fuel-scaffold--vocab parent)))
+           (file (fuel-eval--retort-result ret)))
+      (when file
+        (revert-buffer t t t)
+        (when (and fuel-scaffold-help-header-only-p
+                   (fuel-scaffold--first-vocab))
+          (delete-region (1+ (point)) (point-max))
+          (save-buffer))
+        (message "Inserting template ... done."))
+      (goto-char (point-min)))))
+
+(defun fuel-scaffold--maybe-insert ()
+  (ignore-errors
+    (or (fuel-scaffold--tests (factor-mode--in-tests))
+        (fuel-scaffold--help (factor-mode--in-docs)))))
+
 \f
 ;;; User interface:
 
@@ -73,9 +131,7 @@ You can configure `fuel-scaffold-developer-name' (set by default to
   (interactive "P")
   (let* ((vocab (or (and (not arg) (fuel-syntax--current-vocab))
                     (fuel-completion--read-vocab nil)))
-         (cmd `(:fuel* (,vocab ,fuel-scaffold-developer-name fuel-scaffold-help)
-                       "fuel"))
-         (ret (fuel-eval--send/wait cmd))
+         (ret (fuel-scaffold--create-docs vocab))
          (file (fuel-eval--retort-result ret)))
         (unless file
           (error "Error creating help file" (car (fuel-eval--retort-error ret))))