From a381d12b6d04bce1a4bb0a73f70836e07221e511 Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Tue, 2 Jun 2009 03:21:35 +0200 Subject: [PATCH] FUEL: Automatic insertion of scaffolding in docs and test upon file creation. --- misc/fuel/factor-mode.el | 32 ++++++-------------- misc/fuel/fuel-mode.el | 5 ++- misc/fuel/fuel-scaffold.el | 62 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 27 deletions(-) diff --git a/misc/fuel/factor-mode.el b/misc/fuel/factor-mode.el index af0f62aa27..cc8ebe35fb 100644 --- a/misc/fuel/factor-mode.el +++ b/misc/fuel/factor-mode.el @@ -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) diff --git a/misc/fuel/fuel-mode.el b/misc/fuel/fuel-mode.el index 0186392f34..282ef3240f 100644 --- a/misc/fuel/fuel-mode.el +++ b/misc/fuel/fuel-mode.el @@ -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))) ;;; Keys: diff --git a/misc/fuel/fuel-scaffold.el b/misc/fuel/fuel-scaffold.el index b1c4462503..9b7d9861c7 100644 --- a/misc/fuel/fuel-scaffold.el +++ b/misc/fuel/fuel-scaffold.el @@ -39,6 +39,64 @@ (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))))) + ;;; 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))))