Show More
Commit Description:
Initial working version.
Commit Description:
Initial working version.
References:
File last commit:
Show/Diff file:
Action:
src/project_checkup/core.clj
90 lines | 2.9 KiB | text/x-clojure | ClojureLexer
90 lines | 2.9 KiB | text/x-clojure | ClojureLexer
r0 | #!/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) ) | ||||