Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix contributor counting and automatic deployment #73

Merged
merged 5 commits into from
Dec 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,11 @@ Congratulations, you just built your organization's open source project site!

For compiling the SASS styles into CSS, run the following command at the root of the directory:

sass sass/style.scss:resources/public/style.css
sass sass/style.scss:resources/public/css/style.css

If you want sass to be automatically recompiled when modifying .scss files add the `--watch` flag:

sass --watch sass/style.scss:resources/public/style.css
sass --watch sass/style.scss:resources/public/css/style.css

## License

Expand Down
8 changes: 1 addition & 7 deletions scripts/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,9 @@
git config --global user.name $USER_NAME
git config --global user.email $USER_EMAIL

# Pull latest version of published subtree
git checkout master
git subtree pull --prefix=docs --message="[skip ci] Update subtree" https://47deg:$GITHUB_API_KEY@github.com/47deg/47deg.github.io.git master

# Build & Commit built site
git checkout master
lein run
git add docs
git commit -m "[skip ci] Generate site"
git push https://47deg:$GITHUB_API_KEY@github.com/47deg/org master

# Push built subtree to official website
git subtree push --prefix=docs https://47deg:$GITHUB_API_KEY@github.com/47deg/47deg.github.io.git master
2 changes: 1 addition & 1 deletion src/org/app.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
(defn init!
[]
(let [state (atom (read-state!))
{:keys [organization token-name extra-repos analytics] :as config} (:config @state)]
{:keys [organization token extra-repos analytics] :as config} (:config @state)]
;; turn on analytics
(when analytics
(js/ga "create" analytics "auto")
Expand Down
13 changes: 9 additions & 4 deletions src/org/build.clj
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@
(clojure.edn/read-string (slurp (clojure.java.io/resource path))))

(defn fetch-data!
[{:keys [organization token-name extra-repos]}]
@(c/fetch-org-and-extra-repos! organization {:token-name token-name
[{:keys [organization token extra-repos]}]
@(c/fetch-org-and-extra-repos! organization {:token token
:extra-repos extra-repos}))

(defn make-dirs!
Expand Down Expand Up @@ -144,9 +144,14 @@

(defn -main
[& args]
(let [config (read-config! "config.edn")]
(let [config (read-config! "config.edn")
token (get (System/getenv) (str (:token-name config)))
cfg-with-token (assoc config :token token)]
(when-not (s/valid? :org/config config)
(println "Invalid configuration: " (s/explain-str :org/config config))
(System/exit 1))
(generate-site! config)))
(when-not (s/valid? :org/token token)
(println "Invalid token, you may have missed setting the environment variable " (str \` (:token-name config) \`))
(System/exit 1))
(generate-site! cfg-with-token)))

137 changes: 63 additions & 74 deletions src/org/client.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -111,42 +111,33 @@
result))
(p/rejected (ex-info "Unsuccessful request" {:response resp})))))))

(defn get-token
[token-name]
(let [token (get (System/getenv) (str token-name))]
token))

(def get-token-memo (memoize get-token))

(defn get-repo!
[user repo token-name]
(let [token (get-token-memo token-name)]
(let [req {:method :get
:url (repo-url user repo)
:headers (headers token)}
prom (http/send! client req)]
(p/then prom
(fn [resp]
(if (status/success? resp)
(parse-repo-response resp)
(p/rejected (ex-info "Unsuccessful request" {:response resp}))))))))
[user repo token]
(let [req {:method :get
:url (repo-url user repo)
:headers (headers token)}
prom (http/send! client req)]
(p/then prom
(fn [resp]
(if (status/success? resp)
(parse-repo-response resp)
(p/rejected (ex-info "Unsuccessful request" {:response resp})))))))

(defn get-org-repos!
[org token-name]
(let [token (get-token-memo token-name)]
(let [req {:method :get
:url (org-repos-url org)
:query-string "type=public&per_page=100"
:headers (headers token)}
prom (http/send! client req)]
(p/then prom
(fn [resp]
(if (status/success? resp)
(let [result (parse-repos-response resp)]
(if (has-next? resp)
(get-org-repos-next! token result resp)
result))
(p/rejected (ex-info "Unsuccessful request" {:response resp}))))))))
[org token]
(let [req {:method :get
:url (org-repos-url org)
:query-string "type=public&per_page=100"
:headers (headers token)}
prom (http/send! client req)]
(p/then prom
(fn [resp]
(if (status/success? resp)
(let [result (parse-repos-response resp)]
(if (has-next? resp)
(get-org-repos-next! token result resp)
result))
(p/rejected (ex-info "Unsuccessful request" {:response resp})))))))

(defn parse-languages-response
[resp]
Expand All @@ -157,26 +148,25 @@
(set (keys $))))

(defn get-repo-languages!
[repo token-name]
(let [token (get-token-memo token-name)]
(let [req {:method :get
:url (get repo :languages-url)
:query-string "type=public"
:headers (headers token)}
prom (http/send! client req)]
(p/then prom
(fn [resp]
(if (status/success? resp)
(parse-languages-response resp)
(p/rejected (ex-info "Unsuccessful request" {:response resp}))))))))
[repo token]
(let [req {:method :get
:url (get repo :languages-url)
:query-string "type=public"
:headers (headers token)}
prom (http/send! client req)]
(p/then prom
(fn [resp]
(if (status/success? resp)
(parse-languages-response resp)
(p/rejected (ex-info "Unsuccessful request" {:response resp})))))))

(defn parse-contributors-response
[resp]
(as-> (:body resp) $
#?(:clj
(slurp $))
(j/json->clj $ {:keywordize? false :default []})
(count $)))
(j/json->clj $ {:keywordize? true :default []})
(map :id $)))

(defn get-repo-contributors-next!
[token contribs links]
Expand All @@ -186,59 +176,58 @@
prom (http/send! client req)]
(p/mapcat (fn [resp]
(if (status/success? resp)
(let [result (+ contribs (parse-contributors-response resp))]
(let [result (into contribs (parse-contributors-response resp))]
(if (has-next? resp)
(get-repo-contributors-next! token result (parse-links resp))
(p/resolved result)))
(p/rejected (ex-info "Unsuccessful request" {:response resp}))))
prom)))

(defn get-repo-contributors!
[repo token-name]
(let [token (get-token-memo token-name)]
(let [req {:method :get
:url (get repo :contributors-url)
:query-string "type=public&per_page=100"
:headers (headers token)}
prom (http/send! client req)]
(p/mapcat (fn [resp]
(if (status/success? resp)
(let [result (parse-contributors-response resp)]
(if (has-next? resp)
(get-repo-contributors-next! token result (parse-links resp))
(p/resolved result)))
(p/rejected (ex-info "Unsuccessful request" {:response resp}))))
prom))))
[repo token]
(let [req {:method :get
:url (get repo :contributors-url)
:query-string "type=public&per_page=100"
:headers (headers token)}
prom (http/send! client req)]
(p/mapcat (fn [resp]
(if (status/success? resp)
(let [result (parse-contributors-response resp)]
(if (has-next? resp)
(get-repo-contributors-next! token result (parse-links resp))
(p/resolved result)))
(p/rejected (ex-info "Unsuccessful request" {:response resp}))))
prom)))

;; Data sources

(deftype Repo [user repo]
u/DataSource
(-identity [_]
[:repo [user repo]])
(-fetch [_ {:keys [token-name]}]
(get-repo! user repo token-name)))
(-fetch [_ {:keys [token]}]
(get-repo! user repo token)))

(deftype Repos [org]
u/DataSource
(-identity [_]
[:repos org])
(-fetch [_ {:keys [token-name]}]
(get-org-repos! org token-name)))
(-fetch [_ {:keys [token]}]
(get-org-repos! org token)))

(deftype Languages [repo]
u/DataSource
(-identity [_]
[:languages (:name repo)])
(-fetch [_ {:keys [token-name]}]
(get-repo-languages! repo token-name)))
(-fetch [_ {:keys [token]}]
(get-repo-languages! repo token)))

(deftype Contributors [repo]
u/DataSource
(-identity [_]
[:contributors (:name repo)])
(-fetch [_ {:keys [token-name]}]
(get-repo-contributors! repo token-name)))
(-fetch [_ {:keys [token]}]
(get-repo-contributors! repo token)))

(defn- fetch-languages
[repo]
Expand Down Expand Up @@ -272,12 +261,12 @@
repos))))

(defn fetch-org-and-extra-repos
[org {:keys [token-name extra-repos]}]
[org {:keys [token extra-repos]}]
(u/collect [(fetch-org-repos org)
(fetch-repos extra-repos)]))

(defn fetch-org-and-extra-repos!
[org {:keys [token-name] :as config}]
(p/then (u/run! (fetch-org-and-extra-repos org config) {:env {:token-name token-name}})
[org {:keys [token] :as config}]
(p/then (u/run! (fetch-org-and-extra-repos org config) {:env {:token token}})
(fn [[org-repos extra-repos]]
(concat org-repos extra-repos))))
7 changes: 5 additions & 2 deletions src/org/config.cljc
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
(ns org.config
#?(:clj
(:require [clojure.spec :as s])
(:require [cuerdas.core :as str]
[clojure.spec :as s])
:cljs
(:require [cljs.spec :as s])))
(:require [cuerdas.core :as str]
[cljs.spec :as s])))

;; Organization

Expand Down Expand Up @@ -48,6 +50,7 @@
;; Tokens

(s/def :org/token-name string?)
(s/def :org/token (s/and string? (complement str/blank?)))
(s/def :org/analytics string?)

;; Style
Expand Down
11 changes: 8 additions & 3 deletions src/org/core.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@
(let [langs (into [] (all-languages repos))]
(reverse (sort-by #(count (filter-by-language % repos)) langs))))

(defn sum-contributors
[repos]
(count
(into #{} (mapcat :contributors) repos)))

(rum/defc link-list
[links]
[:ul
Expand Down Expand Up @@ -70,10 +75,10 @@
[:div.github-stats
[:ul
[:li.contributors
[:span (sum-by :contributors repos)]
[:span (sum-contributors repos)]
[:span [:span.octicon.octicon-person] "contributors"]]
[:li.stars
[:span (sum-by :stars repos)]
[:span (transduce (map :stars) + repos)]
[:span [:span.octicon.octicon-star] "stars"]]
[:li.repositories
[:span (count repos)]
Expand Down Expand Up @@ -203,7 +208,7 @@
[:li
{:key "contributors"}
[:span.octicon.octicon-person]
[:span contributors]]]]))
[:span (count contributors)]]]]))

(rum/defc search < rum/reactive
[state]
Expand Down
6 changes: 4 additions & 2 deletions src/org/server.clj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
(when (or (= uri "/")
(= uri "/index.html"))
(let [config (b/read-config! "config.edn")
repos (b/fetch-data! config)]
token (get (System/getenv) (str (:token-name config)))
cfg (assoc config :token token)
repos (b/fetch-data! cfg)]
{:status 200
:headers {"content-type" "text/html"}
:body (b/render-index-page repos config)})))
:body (b/render-index-page repos cfg)})))