Description:
Initial working version.
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
@@ -0,0 +1,15 | |||||
|
|
1 | syntax: glob | ||
|
|
2 | pom.xml | ||
|
|
3 | pom.xml.asc | ||
|
|
4 | *.jar | ||
|
|
5 | *.class | ||
|
|
6 | .gitignore | ||
|
|
7 | .git/** | ||
|
|
8 | node_modules/* | ||
|
|
9 | |||
|
|
10 | syntax: regexp | ||
|
|
11 | ^.nrepl-port | ||
|
|
12 | ^.lein-.* | ||
|
|
13 | ^target/ | ||
|
|
14 | ^classes/ | ||
|
|
15 | ^checkouts/ |
@@ -0,0 +1,38 | |||||
|
|
1 | (defproject project-checkup "0.1.0-SNAPSHOT" | ||
|
|
2 | :description "FIXME: write description" | ||
|
|
3 | :url "http://example.com/FIXME" | ||
|
|
4 | :license {:name "Eclipse Public License" | ||
|
|
5 | :url "http://www.eclipse.org/legal/epl-v10.html"} | ||
|
|
6 | :dependencies [[org.clojure/clojure "1.8.0"] | ||
|
|
7 | [org.clojure/clojurescript "1.9.521"] | ||
|
|
8 | ; [andare "0.9.0"] | ||
|
|
9 | [org.clojure/core.async "0.4.474"] | ||
|
|
10 | |||
|
|
11 | ] | ||
|
|
12 | |||
|
|
13 | :plugins [[lein-cljsbuild "1.1.5"]] | ||
|
|
14 | |||
|
|
15 | :cljsbuild {:builds [{:id "development" | ||
|
|
16 | :source-paths ["src"] | ||
|
|
17 | :compiler {:main project-checkup.core | ||
|
|
18 | :output-to "package/index.js" | ||
|
|
19 | :target :nodejs | ||
|
|
20 | :output-dir "target/development" | ||
|
|
21 | :install-deps true | ||
|
|
22 | :optimizations :none | ||
|
|
23 | :pretty-print true | ||
|
|
24 | :parallel-build true}} | ||
|
|
25 | {:id "optimized" | ||
|
|
26 | :source-paths ["src"] | ||
|
|
27 | :compiler {:main project-checkup.core | ||
|
|
28 | :output-to "package/index.js" | ||
|
|
29 | :target :nodejs | ||
|
|
30 | :output-dir "target/optimized" | ||
|
|
31 | ;; :externs ["externs.js"] | ||
|
|
32 | :install-deps true | ||
|
|
33 | :optimizations :advanced | ||
|
|
34 | :pretty-print true | ||
|
|
35 | :parallel-build true}}]} | ||
|
|
36 | :main ^:skip-aot project-checkup.core | ||
|
|
37 | :target-path "target/%s" | ||
|
|
38 | :profiles {:uberjar {:aot :all}}) |
@@ -0,0 +1,90 | |||||
|
|
1 | #!/usr/bin/env lumo | ||
|
|
2 | (ns project-checkup.core | ||
|
|
3 | (:gen-class) | ||
|
|
4 | (:require [clojure.java.shell :as shell] | ||
|
|
5 | [clojure.string :as string])) | ||
|
|
6 | |||
|
|
7 | (defn get-extension [path] (re-find #"\.[a-zA-Z]+" path)) | ||
|
|
8 | |||
|
|
9 | (defn gather-project-info | ||
|
|
10 | "Creates a dictionary of project information" | ||
|
|
11 | [] | ||
|
|
12 | (let [files (set (map str (file-seq (clojure.java.io/file "."))))] | ||
|
|
13 | {:files files | ||
|
|
14 | :extensions (frequencies (map get-extension files )) | ||
|
|
15 | :path (:out (shell/sh "pwd")) | ||
|
|
16 | :untracked-files (string/split (:out (shell/sh "hg" "st" "-u" "-n")) #"\n") })) | ||
|
|
17 | |||
|
|
18 | (defn color [color string] | ||
|
|
19 | (let [color-sequence (case color | ||
|
|
20 | :green "\u001B[32m" | ||
|
|
21 | :yellow "\u001B[33m" | ||
|
|
22 | :blue "\u001B[34m" | ||
|
|
23 | ) | ||
|
|
24 | reset "\u001B[m" ] | ||
|
|
25 | (str color-sequence string reset)) ) | ||
|
|
26 | |||
|
|
27 | |||
|
|
28 | (defn check-vcs [project] | ||
|
|
29 | (let [{files :files } project] | ||
|
|
30 | (boolean (some #{"./.git" "./.hg"} files)) )) | ||
|
|
31 | |||
|
|
32 | (defn check-readme [project] | ||
|
|
33 | (let [{files :files } project] | ||
|
|
34 | (boolean (some #{"./README.md" "./README.txt" "./README.mkd"} files)) )) | ||
|
|
35 | |||
|
|
36 | (defn check-untracked [project] | ||
|
|
37 | (let [{untracked :untracked-files } project] | ||
|
|
38 | (= (count untracked) 0)) ) | ||
|
|
39 | |||
|
|
40 | (defn check-taskpaper [project] | ||
|
|
41 | (let [{extensions :extensions } project] | ||
|
|
42 | (>= (get ".taskpaper" extensions 0) 1) )) | ||
|
|
43 | |||
|
|
44 | (def checks [{:name "Has VCS" | ||
|
|
45 | :description "" | ||
|
|
46 | :function check-vcs | ||
|
|
47 | :level :error | ||
|
|
48 | :follow-up "Initialize a repository." } | ||
|
|
49 | {:name "Always True" | ||
|
|
50 | :function #(or true %) | ||
|
|
51 | :level :error | ||
|
|
52 | :follow-up "This is a bug." } | ||
|
|
53 | {:name "Has Untracked" | ||
|
|
54 | :description "" | ||
|
|
55 | :function check-untracked | ||
|
|
56 | :level :warning | ||
|
|
57 | :follow-up "Commit or ignore files from 'hg st -u'." } | ||
|
|
58 | {:name "No Todo" | ||
|
|
59 | :function check-taskpaper | ||
|
|
60 | :description "" | ||
|
|
61 | :level :suggestion | ||
|
|
62 | :follow-up "Add a todo file using Taskpaper." } | ||
|
|
63 | {:name "Has Readme" | ||
|
|
64 | :function check-readme | ||
|
|
65 | :description "Readme exists" | ||
|
|
66 | :level :suggestion | ||
|
|
67 | :follow-up "Add a README." } ]) | ||
|
|
68 | |||
|
|
69 | (defn perform-check [check project] | ||
|
|
70 | (let [{check-name :name function :function follow-up :follow-up | ||
|
|
71 | level :level } check | ||
|
|
72 | result (function project) | ||
|
|
73 | false-color (case level | ||
|
|
74 | :suggestion :blue | ||
|
|
75 | :warning :yellow | ||
|
|
76 | :error :red | ||
|
|
77 | :red) ] | ||
|
|
78 | {:name check-name | ||
|
|
79 | :result result | ||
|
|
80 | :output (if result | ||
|
|
81 | (color :green (str "✓" check-name " passed!")) | ||
|
|
82 | (str check-name (color false-color " failed! ") "\n\tFollow up: " follow-up))})) | ||
|
|
83 | |||
|
|
84 | |||
|
|
85 | (defn -main | ||
|
|
86 | "I don't do a whole lot ... yet." | ||
|
|
87 | [& args] | ||
|
|
88 | (doseq [check checks] | ||
|
|
89 | (println (:output (perform-check check (gather-project-info) )))) | ||
|
|
90 | (shutdown-agents) ) |
You need to be logged in to leave comments.
Login now