(defun snowball-reformat-chanced-file () "Run the current buffer through Pint." (interactive) (let ((format-file-name (concat "fmt-" (file-name-nondirectory (buffer-file-name))))) (unwind-protect (progn (write-region (point-min) (point-max) format-file-name) (shell-command (format "%s %s" (expand-file-name "../chanced-scripts/format" (project-root (project-current))) (file-relative-name format-file-name (project-root (project-current)))) nil nil) (let ((temp-buffer (find-file-noselect format-file-name))) (unwind-protect (replace-buffer-contents temp-buffer) (kill-buffer temp-buffer)))) (delete-file format-file-name)))) (defun tomwpunt:enable-directory-local-modes () "Enable hooks and modes that are bound to specific directory." (cond ((string-suffix-p "src/social-api/" (or (and-let* ((project (project-current))) (project-root project)) "")) (local-set-key (kbd "C-c c") #'artisan-transient) (when (equal major-mode 'php-mode) (add-hook 'before-save-hook 'snowball-reformat-chanced-file nil t))))) (add-hook 'find-file-hook 'tomwpunt:enable-directory-local-modes) (transient-define-prefix artisan-transient () "A transient to run artisan commands." ["Punt" ["Composer" ("pci" "Install" artisan-punt-composer-install)] ["Artisan" ("pac" "Run Command" artisan-punt-run-command) ("pam" "Migrate" artisan-punt-migrate) ("pat" "Test" artisan-punt-test)]] ["Chanced" ["Composer" ("cci" "Install" artisan-chanced-composer-install)] ["Artisan" ("cac" "Run Command" artisan-chanced-run-command) ("cam" "Migrate" artisan-chanced-migrate) ("cat" "Test" artisan-chanced-test)]]) (defun artisan-punt-composer-install () (interactive) (let ((default-directory (expand-file-name "punt" (project-root (project-current))))) (async-shell-command "docker exec -it punt-backend composer install"))) (defun artisan-chanced-composer-install () (interactive) (let ((default-directory (expand-file-name "chanced" (project-root (project-current))))) (async-shell-command "docker exec -it chanced-backend composer install"))) (defun artisan-punt-run-command (command) (interactive (list (read-string "Command: "))) (let ((default-directory (expand-file-name "punt" (project-root (project-current))))) (async-shell-command (format "docker exec -it punt-backend php artisan %s" command)))) (defun artisan-chanced-run-command (command) (interactive (list (read-string "Command: "))) (let ((default-directory (expand-file-name "chanced" (project-root (project-current))))) (async-shell-command (format "docker exec -it chanced-backend php artisan %s" command)))) (defun artisan-punt-migrate () (interactive) (let ((default-directory (expand-file-name "punt" (project-root (project-current))))) (async-shell-command "docker exec -it punt-backend php artisan migrate"))) (defun artisan-chanced-migrate () (interactive) (let ((default-directory (expand-file-name "chanced" (project-root (project-current))))) (async-shell-command "docker exec -it chanced-backend php artisan migrate"))) (defun artisan-punt-test (pick) (interactive "P") (artisan--test-internal pick "punt" "chanced")) (defun artisan-chanced-test (pick) (interactive "P") (artisan--test-internal pick "chanced" "punt")) (defvar artisan--test-last-command nil "The last testing commnand that was run in the test buffer. This variable should always be buffer local and only set in test buffers.") (make-variable-buffer-local 'artisan--test-last-command) (defun artisan--test-internal (pick name ignore) (let* ((default-directory (expand-file-name name (project-root (project-current)))) (buffer-name (format "*%s Tests*" (capitalize name))) (buffer (get-buffer-create buffer-name)) (files (cons '("all" . "") (mapcar (lambda (dir) (cons (file-name-nondirectory dir) dir)) (directory-files-recursively "../" (rx "Test.php") nil (lambda (subdir) (not (or (string-suffix-p "vendor" subdir) (string-suffix-p ignore subdir)))))))) (command (with-current-buffer buffer (or (and (not pick) artisan--test-last-command) (format "../../chanced-scripts/test %s %s" name (map-elt files (completing-read "File: " files nil t)))))) (compilation-scroll-output t)) (cl-letf (((symbol-function 'compilation-buffer-name) (lambda (&rest args) buffer-name))) (compile command)) (with-current-buffer buffer (setq artisan--test-last-command command) (local-set-key (kbd "g") (lambda () (interactive) (artisan--test-internal nil name ignore))) (local-set-key (kbd "q") #'bury-buffer))))