git.fiddlerwoaroof.com
package-grapher.lisp
19416172
 (defpackage #:tempores.package-grapher
   (:use #:cl))
 
 (in-package #:tempores.package-grapher)
 
 (defun get-dependencies (package)
   (let ((source-package-name package)
         (package (find-package package)))
     (remove-duplicates
       (stable-sort 
         (loop for x being the symbols in package
               unless (eq package (symbol-package x))
               collect (list source-package-name
                             (alexandria:make-keyword (package-name (symbol-package x)))))
         #'string< 
         :key #'cadr)
       :test 'equal)))
 
 (defun get-all-dependencies (packages)
   (stable-sort 
     (loop for package in packages
           nconc (get-dependencies package)) 
     #'string< 
     :key #'cadr))
 
 (defun make-graph-conns (conns)
   (format nil "~:{~4t~(\"~a\" -> \"~a\"~%~)~}" conns))
 
 (defun make-graph (conns)
   (format nil "digraph {~%~a~%}~%" (make-graph-conns conns)))
 
 (defun graph-packages (packages)
   (make-graph (get-all-dependencies packages)))
 
 (defun graph-tempores-packages ()
   (graph-packages tempores.packages:*tempores-packages*))