-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.clj
81 lines (65 loc) · 2.91 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
(ns cake-github.core
(:use [clojure.java.shell :only [sh]]))
(def line "\n-------------------------------------------\n")
(defn get-config [parameter]
(apply str (butlast (:out (sh "git" "config" "--global" (str "github." parameter))))))
(def auth {:username (get-config "user")
:token (get-config "token")})
(defn clone-urls [res-map]
(if (map? res-map)
(let [owner (if-let [owner (:owner res-map)] owner (:username res-map))
name (:name res-map)]
(assoc res-map
:clone_url (str "git://github.com/" owner "/" name ".git")
:ssh_clone_url (str "git@github.com:" owner "/" name ".git")))
res-map))
(defn format-options [m & keys]
(apply concat (map (fn [[k v]] [k (first v)]) (apply dissoc m keys))))
(defn line-template [width] (str "%-" (inc width) "s %s"))
(defn format-line [lt k v] (str (format lt (.replaceAll (str (name k) ":") "_" " ") v) "\n"))
(defn format-keys [lt m keyseq] (apply str (for [[k v] (select-keys m keyseq)] (format-line lt k v))))
(defn order-format [lt m keyseq] (apply str (concat (map (partial format-keys lt m) keyseq))))
(defn format-repo-result [m]
(let [width (apply max
(map #(count (name (first %)))
(select-keys m [:watchers :pushed_at :forks
:open_issues :created_at :pushed_at
:clone_url :ssh_clone_url])))
lt (line-template width)]
(str
(or (:owner m) (:username m)) "/"(:name m) (if (:fork m) " \u0470 " " ") "- " (:description m)
line
(when (:url m) (str (:url m) "\n"))
(order-format lt m [[:watchers :forks :open_issues]
[:pushed_at :created_at]
[:clone_url :ssh_clone_url]]))))
;; This will likely become a multimethod.
(defn format-result-helper [result map-type]
(str "\n"
(cond
(and (map? result) (= map-type :repo)) (format-repo-result result)
(and (map? result) (= map-type :user)) result ;; Placeholder
(string? result) result
(nil? result) "wut"
(not (seq result)) "Nothing interested happened."
:else (apply str (interpose ", " result)))
"\n"))
(defn option-to-int [opt default]
(cond
(vector? opt) (Integer/parseInt (first opt))
(string? opt) (Integer/parseInt opt)
(nil? opt) default
:else opt))
(defn format-result [x & {:keys [max generate-clone-urls map-type]
:or {max 3 generate-clone-urls false map-type :repo}}]
(println
(if (some map? x)
(apply str
(map #(format-result-helper % map-type)
(let [maps (take (option-to-int max 3) x)]
(if generate-clone-urls
(map clone-urls maps)
maps))))
(format-result-helper (if generate-clone-urls (clone-urls x) x) map-type))))
(defn options [opts & options]
(some opts options))