#!/usr/bin/env lumo (ns project-checkup.core (:gen-class) (:require [clojure.java.shell :as shell] [clojure.string :as string])) (defn get-extension [path] (re-find #"\.[a-zA-Z]+" path)) (defn gather-project-info "Creates a dictionary of project information" [] (let [files (set (map str (file-seq (clojure.java.io/file "."))))] {:files files :extensions (frequencies (map get-extension files )) :path (:out (shell/sh "pwd")) :untracked-files (string/split (:out (shell/sh "hg" "st" "-u" "-n")) #"\n") })) (defn color [color string] (let [color-sequence (case color :green "\u001B[32m" :yellow "\u001B[33m" :blue "\u001B[34m" ) reset "\u001B[m" ] (str color-sequence string reset)) ) (defn check-vcs [project] (let [{files :files } project] (boolean (some #{"./.git" "./.hg"} files)) )) (defn check-readme [project] (let [{files :files } project] (boolean (some #{"./README.md" "./README.txt" "./README.mkd"} files)) )) (defn check-untracked [project] (let [{untracked :untracked-files } project] (= (count untracked) 0)) ) (defn check-taskpaper [project] (let [{extensions :extensions } project] (>= (get ".taskpaper" extensions 0) 1) )) (def checks [{:name "Has VCS" :description "" :function check-vcs :level :error :follow-up "Initialize a repository." } {:name "Always True" :function #(or true %) :level :error :follow-up "This is a bug." } {:name "Has Untracked" :description "" :function check-untracked :level :warning :follow-up "Commit or ignore files from 'hg st -u'." } {:name "No Todo" :function check-taskpaper :description "" :level :suggestion :follow-up "Add a todo file using Taskpaper." } {:name "Has Readme" :function check-readme :description "Readme exists" :level :suggestion :follow-up "Add a README." } ]) (defn perform-check [check project] (let [{check-name :name function :function follow-up :follow-up level :level } check result (function project) false-color (case level :suggestion :blue :warning :yellow :error :red :red) ] {:name check-name :result result :output (if result (color :green (str "✓" check-name " passed!")) (str check-name (color false-color " failed! ") "\n\tFollow up: " follow-up))})) (defn -main "I don't do a whole lot ... yet." [& args] (doseq [check checks] (println (:output (perform-check check (gather-project-info) )))) (shutdown-agents) )