Skip to content

Commit 83f5df9

Browse files
author
Bastien Guerry
committed
src/consolidate-datacodegouvfr.clj: Spit awesome.json
1 parent e8c8a26 commit 83f5df9

File tree

1 file changed

+56
-19
lines changed

1 file changed

+56
-19
lines changed

src/consolidate-datacodegouvfr.clj

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,51 @@
66

77
;; TODO:
88
;; - spit tags.json for awesome software
9-
;; - spit latest-tags.json for awesome software
9+
;; - spit latest-tags.xml for awesome software
1010

1111
(deps/add-deps '{:deps {clj-rss/clj-rss {:mvn/version "0.4.0"}}})
1212
(deps/add-deps '{:deps {org.babashka/cli {:mvn/version "0.8.60"}}})
13+
1314
(require '[clj-rss.core :as rss]
1415
'[clojure.tools.logging :as log]
1516
'[babashka.cli :as cli])
1617

1718
;; Define CLI options
1819
(def cli-options
19-
{:test-msg {:desc "Testing options"
20-
:default "This is a default test message"}})
20+
{:test {:desc "Testing?"
21+
:default nil}})
2122

2223
;; Initialize atoms
2324
(def hosts (atom ()))
2425
(def forges (atom ()))
2526
(def owners (atom {}))
2627
(def repositories (atom {}))
28+
(def awesome (atom ()))
2729

2830
(def urls {:hosts "https://data.code.gouv.fr/api/v1/hosts"
2931
:annuaire_sup "https://code.gouv.fr/data/annuaire_sup.json"
3032
:annuaire_tops "https://code.gouv.fr/data/annuaire_tops.json"
31-
:comptes-organismes-publics "https://code.gouv.fr/data/comptes-organismes-publics.yml"})
33+
:comptes-organismes-publics "https://code.gouv.fr/data/comptes-organismes-publics.yml"
34+
:awesome-codegouvfr "https://code.gouv.fr/data/awesome-codegouvfr.yml"})
3235

3336
;; Helper function
3437
(defn toInst [^String s]
3538
(.toInstant (clojure.instant/read-instant-date s)))
3639

3740
;; Fetching functions
3841
(defn fetch-json [url]
39-
(let [res (curl/get url)]
40-
(if (= (:status res) 200)
41-
(json/parse-string (:body res) true)
42-
(log/error "Failed to fetch JSON from" url "Status:" (:status res)))))
42+
(let [res (try (curl/get url)
43+
(catch Exception _
44+
(log/error "Failed to fetch JSON from" url)))]
45+
(when (= (:status res) 200)
46+
(json/parse-string (:body res) true))))
4347

4448
(defn fetch-yaml [url]
45-
(let [res (curl/get url)]
46-
(if (= (:status res) 200)
47-
(yaml/parse-string (:body res) :keywords false)
48-
(log/error "Failed to fetch YAML from" url "Status:" (:status res)))))
49+
(let [res (try (curl/get url)
50+
(catch Exception _
51+
(log/error "Failed to fetch YAML from" url)))]
52+
(when (= (:status res) 200)
53+
(yaml/parse-string (:body res) :keywords false))))
4954

5055
(defn fetch-annuaire []
5156
(log/info "Fetching annuaire at" (:annuaire_sup urls))
@@ -62,9 +67,10 @@
6267
(into {})))
6368

6469
;; Set hosts, owners, repositories and public forges
65-
(defn set-hosts! []
70+
(defn set-hosts! [test]
6671
(log/info "Fetching hosts from" (:hosts urls))
67-
(reset! hosts (or (fetch-json (:hosts urls)) ())))
72+
(let [res (or (fetch-json (:hosts urls)) ())]
73+
(reset! hosts (if test (take 1 res) res))))
6874

6975
(defn set-owners! []
7076
(doseq [{:keys [owners_url]} @hosts]
@@ -82,7 +88,7 @@
8288
(let [url (str repositories_url (format "?page=%s&per_page=1000" (+ n 1)))]
8389
(when-let [data (try (fetch-json url)
8490
(catch Exception e
85-
(log/error "Error fetching repos froma" (.getMessage e))))]
91+
(log/error "Error fetching repos from" (.getMessage e))))]
8692
(log/info "Fetching repos data from" url)
8793
(doseq [e data]
8894
(swap! repositories assoc
@@ -92,9 +98,38 @@
9298
(dissoc :repository_url)))))))))
9399

94100
(defn set-public-sector-forges! []
95-
(log/info "Fetching public sector forges from comptes-organismes-pubics.yml")
101+
(log/info "Fetching public sector forges from comptes-organismes-publics.yml")
96102
(reset! forges (or (fetch-yaml (:comptes-organismes-publics urls)) {})))
97103

104+
(defn set-awesome! []
105+
(log/info "Fetching public sector forges from comptes-organismes-pubics.yml")
106+
(reset! awesome (or (fetch-yaml (:awesome-codegouvfr urls)) {})))
107+
108+
(defn prefix-raw-file [awesome-repo]
109+
(let [{:keys [html_url full_name default_branch platform]}
110+
(->> @repositories
111+
(filter #(= (str/lower-case (:html_url (val %))) awesome-repo))
112+
first
113+
second)]
114+
(condp = platform
115+
"github" (format "https://raw.githubusercontent.com/%s/%s/" full_name default_branch)
116+
"gitlab" (format "%s/-/raw/%s/" html_url default_branch)
117+
"sourcehut" (format "%s/blob/%s/" html_url default_branch)
118+
nil)))
119+
120+
(defn update-awesome! []
121+
(->> @awesome
122+
(map
123+
(fn [[k v]]
124+
(if-let [res (fetch-yaml (str (prefix-raw-file (str/lower-case k)) "publiccode.yml"))]
125+
[k (conj v res)]
126+
[k v])))
127+
;; doall
128+
(reset! awesome)))
129+
130+
(defn output-awesome-json []
131+
(spit "awesome.json" (json/generate-string @awesome)))
132+
98133
;; Processing function
99134
(defn update-owners! []
100135
(doseq [[f forge-data] @forges]
@@ -307,19 +342,21 @@
307342

308343
;; Main execution
309344
(defn -main [args]
310-
(let [{:keys [test-msg] :as opts}
311-
(cli/parse-opts args {:spec cli-options})]
312-
(set-hosts!)
345+
(let [{:keys [test]} (cli/parse-opts args {:spec cli-options})]
346+
(set-hosts! test)
313347
(set-owners!)
314348
(set-repos!)
315349
(set-public-sector-forges!)
350+
(set-awesome!)
316351
(update-owners!)
352+
(update-awesome!)
317353
(output-owners-json)
318354
(output-latest-owners-xml)
319355
(output-repositories-json)
320356
(output-latest-repositories-xml)
321357
(output-forges-csv)
322358
(output-stats-json)
359+
(output-awesome-json)
323360
(log/info "Hosts:" (count @hosts))
324361
(log/info "Owners:" (count @owners))
325362
(log/info "Repositories:" (count @repositories))

0 commit comments

Comments
 (0)