|
6 | 6 |
|
7 | 7 | ;; TODO: |
8 | 8 | ;; - spit tags.json for awesome software |
9 | | -;; - spit latest-tags.json for awesome software |
| 9 | +;; - spit latest-tags.xml for awesome software |
10 | 10 |
|
11 | 11 | (deps/add-deps '{:deps {clj-rss/clj-rss {:mvn/version "0.4.0"}}}) |
12 | 12 | (deps/add-deps '{:deps {org.babashka/cli {:mvn/version "0.8.60"}}}) |
| 13 | + |
13 | 14 | (require '[clj-rss.core :as rss] |
14 | 15 | '[clojure.tools.logging :as log] |
15 | 16 | '[babashka.cli :as cli]) |
16 | 17 |
|
17 | 18 | ;; Define CLI options |
18 | 19 | (def cli-options |
19 | | - {:test-msg {:desc "Testing options" |
20 | | - :default "This is a default test message"}}) |
| 20 | + {:test {:desc "Testing?" |
| 21 | + :default nil}}) |
21 | 22 |
|
22 | 23 | ;; Initialize atoms |
23 | 24 | (def hosts (atom ())) |
24 | 25 | (def forges (atom ())) |
25 | 26 | (def owners (atom {})) |
26 | 27 | (def repositories (atom {})) |
| 28 | +(def awesome (atom ())) |
27 | 29 |
|
28 | 30 | (def urls {:hosts "https://data.code.gouv.fr/api/v1/hosts" |
29 | 31 | :annuaire_sup "https://code.gouv.fr/data/annuaire_sup.json" |
30 | 32 | :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"}) |
32 | 35 |
|
33 | 36 | ;; Helper function |
34 | 37 | (defn toInst [^String s] |
35 | 38 | (.toInstant (clojure.instant/read-instant-date s))) |
36 | 39 |
|
37 | 40 | ;; Fetching functions |
38 | 41 | (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)))) |
43 | 47 |
|
44 | 48 | (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)))) |
49 | 54 |
|
50 | 55 | (defn fetch-annuaire [] |
51 | 56 | (log/info "Fetching annuaire at" (:annuaire_sup urls)) |
|
62 | 67 | (into {}))) |
63 | 68 |
|
64 | 69 | ;; Set hosts, owners, repositories and public forges |
65 | | -(defn set-hosts! [] |
| 70 | +(defn set-hosts! [test] |
66 | 71 | (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)))) |
68 | 74 |
|
69 | 75 | (defn set-owners! [] |
70 | 76 | (doseq [{:keys [owners_url]} @hosts] |
|
82 | 88 | (let [url (str repositories_url (format "?page=%s&per_page=1000" (+ n 1)))] |
83 | 89 | (when-let [data (try (fetch-json url) |
84 | 90 | (catch Exception e |
85 | | - (log/error "Error fetching repos froma" (.getMessage e))))] |
| 91 | + (log/error "Error fetching repos from" (.getMessage e))))] |
86 | 92 | (log/info "Fetching repos data from" url) |
87 | 93 | (doseq [e data] |
88 | 94 | (swap! repositories assoc |
|
92 | 98 | (dissoc :repository_url))))))))) |
93 | 99 |
|
94 | 100 | (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") |
96 | 102 | (reset! forges (or (fetch-yaml (:comptes-organismes-publics urls)) {}))) |
97 | 103 |
|
| 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 | + |
98 | 133 | ;; Processing function |
99 | 134 | (defn update-owners! [] |
100 | 135 | (doseq [[f forge-data] @forges] |
|
307 | 342 |
|
308 | 343 | ;; Main execution |
309 | 344 | (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) |
313 | 347 | (set-owners!) |
314 | 348 | (set-repos!) |
315 | 349 | (set-public-sector-forges!) |
| 350 | + (set-awesome!) |
316 | 351 | (update-owners!) |
| 352 | + (update-awesome!) |
317 | 353 | (output-owners-json) |
318 | 354 | (output-latest-owners-xml) |
319 | 355 | (output-repositories-json) |
320 | 356 | (output-latest-repositories-xml) |
321 | 357 | (output-forges-csv) |
322 | 358 | (output-stats-json) |
| 359 | + (output-awesome-json) |
323 | 360 | (log/info "Hosts:" (count @hosts)) |
324 | 361 | (log/info "Owners:" (count @owners)) |
325 | 362 | (log/info "Repositories:" (count @repositories)) |
|
0 commit comments